为什么我不能通过传递它的变量名来运行这个回调,但我可以将它包装在一个函数中?

时间:2013-01-22 09:43:02

标签: javascript jquery

只是一个简单的问题。在我目前的理解中,以下两个代码块是相同的,除了一个被包含在函数中。为什么它适用于方法1,而不适用于方法2?有什么不同?

方法1:

// Reset button
$('.reset').button({
    icons: {primary: 'ui-icon-closethick'}
}).click(function(){groupList.change()});

方法2:

// Reset button
$('.reset').button({
    icons: {primary: 'ui-icon-closethick'}
}).click(groupList.change);

编辑: JSFiddle:http://jsfiddle.net/B8YEa/2/ - 请注意点击“两个”如何抛出错误Uncaught TypeError: Object #<HTMLButtonElement> has no method 'on'和“一个”就好了,以及实际更改选择

2 个答案:

答案 0 :(得分:4)

不同之处在于第一个代码将函数作为对象的方法调用,而第二个代码将函数作为独立函数调用。

在第一种情况下,this将引用函数内的groupList对象,而在第二种情况下,this将引用全局window对象。

如果您调用一个函数将其指定为对象成员,例如obj.method();,它将被称为方法。如果您获得该函数的引用并调用它,例如var m = obj.method; m();,然后该方法不再与该对象相关联。


此外,正如Thilo所指出的,第一个代码将在每次事件发生时查找方法,而第二个代码将在事件绑定时查找方法一次。

答案 1 :(得分:1)

如果groupList.change尚不存在,但稍后定义(但在用户点击之前),则存在差异。如果稍后重新定义,则相同。

当点击发生时,第一个代码会解析groupList.change

第二个代码立即解析groupList.change