我创建了一个在事件发生时调用的函数。直接调用我的函数不起作用,我需要使用匿名函数。我为什么需要这样做?有人可以解释一下逻辑,以避免我为这种愚蠢的错误而浪费时间吗?
因为直接调用函数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();
}
});
);
谢谢
答案 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());