这是一个小提琴:
https://jsfiddle.net/5k10h27j/
为什么在设置为未定义函数的参数时会调用foo()
?
function foo(){
alert('huh??');
}
jQuery('#container').on('change', 'input', function(e){
console.log('change');
}).blahblah(foo());
答案 0 :(得分:2)
在尝试定位未定义的函数之前调用该函数。
在像
这样的表达式中 objectReference.propertyName( arg1, arg2, arg3 )
语言规范规定在进行任何测试之前评估参数,以确定函数引用是否实际有效。因此,对参数列表中foo()
的调用进行求值,并且只有在知道其值之后才进行任何测试,以查看属性引用是否属于实函数。
Here is the relevant portion of the spec.第3步是对参数的评估,第4步是测试代码所说的作为函数调用的东西是否实际上是函数。
答案 1 :(得分:1)
因为你正在打电话。 foo()
。您可以在.blahblah(foo);
答案 2 :(得分:0)
首先,你需要在某个地方定义你的blahblah函数,并且必须对jQuery进行原型化以便在链接中使用。一旦使用回调参数定义了函数,就可以通过传递foo引用而不是函数调用来调用它。
$.fn.blahblah = function ( callback ) {
callback();
return this; // if you want to keep chaining
};
function foo () {
alert( 'huh??' );
}
$( '#container' )
.on( 'change', function () {
console.log( 'change' );
})
.blahblah( foo );
// in this case you can keep chaining since blahblah is returning 'this'.