为什么我必须这样做:
$('#myfoo').change(function(){mylongfunc();});
而不是:
$('#myfoo').change(mylongfunc());
那个额外的函数(){}包装器做了什么?
答案 0 :(得分:2)
您不需要包装器功能,只需对您的方法进行一些调整,如下所示:
$('#myfoo').change(mylongfunc);
function() {}
只是一个匿名函数,你可以直接使用你想要的命名函数,只需传递函数。
mylongfunc //passes the function
mylongfunc() //passes the RESULT of the function
答案 1 :(得分:0)
有一个微妙的区别。
执行function(){ myLongFunc(); }
时,您正在定义一个匿名函数,该函数是myLongFunc
的包装。
执行change(myLongFunc())
时,您无法获得预期的结果,因为实际上调用函数并将调用结果传递给change
。
所以你真正想做的是change(myLongFunc)
,因为现在你传递的是实际的函数对象。
还有另一种情况:
var myLongFunc = function() { ... };
现在当你传入myLongFunc
时,你传递了对匿名函数的引用。
Javascript函数采用的另一种形式是函数文字,您可以在其中定义函数并立即调用它。这是有效的,因为函数是Javascript中的第一类对象:
(function() {
...
})();
甚至:
(function myFunc() {
...
})();
在这种情况下,您正在定义该函数并立即调用它。在创建框架或库时,此表单通常用于命名空间和封装。 jQuery这样做,它被称为模块模式。
答案 2 :(得分:0)
这使用“匿名”功能。
$('#myfoo').change(function(){mylongfunc();});
这使用预定义的可重用函数。 注意:我从()
mylongfunc
$('#myfoo').change(mylongfunc);
当它们只使用一次时使用匿名函数。
在多次使用(或由其他代码共享)时使用常规函数。