Javascript 使用函数作为函数的参数:为什么使用匿名函数?

Javascript 使用函数作为函数的参数:为什么使用匿名函数?,javascript,function,Javascript,Function,我创建了一个在事件发生时调用的函数。直接调用我的函数不起作用,我需要使用匿名函数。我为什么要这样做?有人能解释一下逻辑,避免我为这些愚蠢的错误浪费时间吗 无法工作,因为直接调用函数checkInBackEnd $('#signup-email').change( checkInBackEnd($('#signup-email'), 'email-unique.php', function(result){ if(result == 1){ $('#

我创建了一个在事件发生时调用的函数。直接调用我的函数不起作用,我需要使用匿名函数。我为什么要这样做?有人能解释一下逻辑,避免我为这些愚蠢的错误浪费时间吗

无法工作,因为直接调用函数checkInBackEnd

$('#signup-email').change(
    checkInBackEnd($('#signup-email'), 'email-unique.php', function(result){
        if(result == 1){
            $('#signup-error-email').show();
        }
        else{
            $('#signup-error-email').hide();
        }
    })
);
它之所以有效,是因为我使用的匿名函数是change函数:

$('#signup-email').change(function(){
    checkInBackEnd($('#signup-email'), 'email-unique.php', function(result){
        if(result == 1){
            $('#signup-error-email').show();
        }
        else{
            $('#signup-error-email').hide();
        }
    });
);
function doCheckIn() {
    checkInBackEnd($('#signup-email'), 'email-unique.php', function(result){
    if(result == 1){
        $('#signup-error-email').show();
    }
    else{
        $('#signup-error-email').hide();
    }
}

谢谢

它不必是匿名函数。您可以定义命名函数:

$('#signup-email').change(function(){
    checkInBackEnd($('#signup-email'), 'email-unique.php', function(result){
        if(result == 1){
            $('#signup-error-email').show();
        }
        else{
            $('#signup-error-email').hide();
        }
    });
);
function doCheckIn() {
    checkInBackEnd($('#signup-email'), 'email-unique.php', function(result){
    if(result == 1){
        $('#signup-error-email').show();
    }
    else{
        $('#signup-error-email').hide();
    }
}
然后将其作为回调参数传递:

$('#signup-email').change(doCheckIn);
我们通常使用匿名函数,因为这些回调函数只在那个地方需要。如果只使用一次,就不需要给它命名。过一会儿你就会习惯这个成语


但重要的是,事件绑定函数的参数必须是函数。在触发事件之前不应调用该函数。如果将函数调用放入
.change()
,则函数将在设置事件绑定时调用,而不是稍后调用。

分解代码以更好地理解:首先让我们看一个简化的示例:

function fakeChangeFunction(myFn) {
  val result = myFn(); // We expect to have a function
  doSomethingWithResult(result);
}

function myChangeFunctionExample() {
  alert('foobar');
  // returns undefined implicitly
}

// Doesn't work
fakeChangeFunction(myChangeFunctionExample()); // This will cause an error

// Works
fakeChangeFunction(myChangeFunctionExample); // Notice no parenthasis

// Works
fakeChangeFunction(function() {
  myChangeFunctionExample();
});

// Works
function returnsAFunction() {
  return function() {
    alert('barfoo');
  };
}

fakeChangeFunction(returnsAFunction());

这是因为
checkInBackEnd($(…)
是一个函数调用。当需要引用时,不应调用函数。或者,如果你打算,注意,被调用的函数返回一个函数引用(或者一个匿名函数)?我们需要一直使用匿名函数?我们可以,但如果应该,取决于在最初调用的函数中如何使用该特定参数。不,您可以使用命名函数,只要它不需要任何参数,因此您可以执行
。更改(myownfunction)
。请注意,必须在调用change方法时声明该函数,否则将传递undefined。OK。非常感谢。因此,重要的是检查
change
所期望的参数。