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