【发布时间】:2012-01-15 18:35:59
【问题描述】:
我最近浏览了js代码,下面的语法不断出现:
var foo = bar.bi = function() {...}
这对我来说是不熟悉的语法。是否只是为同一个函数定义两个名称?如果是这样,为什么不只定义为bar.bi = function()?
【问题讨论】:
标签: javascript function syntax
我最近浏览了js代码,下面的语法不断出现:
var foo = bar.bi = function() {...}
这对我来说是不熟悉的语法。是否只是为同一个函数定义两个名称?如果是这样,为什么不只定义为bar.bi = function()?
【问题讨论】:
标签: javascript function syntax
同时为变量和bar对象的bi属性赋值。
这样对象的属性获取值,但你仍然可以将它作为变量引用,这可能会快一点。
实际上与...相同
bar.bi = function() {...};
var foo = bar.bi;
foo === bar.bi; // true
或者您可以将其可视化为...
var foo = ( bar.bi = function() {...} );
所以首先分配给bar.bi。赋值表达式返回的结果是同一个函数,该结果被赋值给foo。
【讨论】:
除了将函数分配给 2 个变量之外,上下文还会根据您调用它的方式而变化。
bar.bi();
会将其上下文作为bar 对象,就好像您会使用它一样:
foo.call(bar);
但是在其他变量中使用它,像这样:
foo();
将使用foo 的上下文。因此,如果foo 在全局上下文中,它将等价于:
bar.bi.call(window);
【讨论】:
这只是一个复合作业
var r = x = 3;
将 3 赋给 x,也赋给新声明的 r。
您的示例只是用一个函数代替 3,并用一个对象属性 —bar.bi — 代替 x。
【讨论】:
这取决于它在哪里使用。
foo和bar.bi在这里都指向同一个函数。这意味着可以使用调用该函数
foo();
和
bar.bi();
同时函数内部this的值也不同。要使第一个等于第二个,应该如下调用它
foo.call(bar);
或
foo.apply(bar);
这确保this 将指向函数内部的bar。
请参考:
https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/call.
https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/apply.
.
【讨论】:
var foo = bar.bi = function() {...};
bar.bi === function() {...} //true
foo === bar.bi //true
bar 将是一个响应方法 bi 的对象。
【讨论】:
=== 比较将是 // false 因为你正在比较两个不同的函数对象。你的最后一个当然是正确的。