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

Use of a function as parameter of a function: why use of anonym function?

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

不起作用,因为直接调用函数 checkInBackEnd

$('#signup-email').change(
    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());