为什么`foo()`在这里工作?

时间:2015-03-30 22:12:30

标签: javascript jquery

这是一个小提琴:

https://jsfiddle.net/5k10h27j/

为什么在设置为未定义函数的参数时会调用foo()

function foo(){
    alert('huh??');   
}
jQuery('#container').on('change', 'input', function(e){
    console.log('change');  
}).blahblah(foo());

3 个答案:

答案 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'.