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

时间:2015-01-02 12:58:16

标签: javascript 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();
        }
    });
);

谢谢

2 个答案:

答案 0 :(得分:3)

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

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()中放置函数调用,则在您设置事件绑定时将调用该函数,而不是稍后。

答案 1 :(得分:0)

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

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());