我最近浏览了js代码,以下语法不断出现:
var foo = bar.bi = function() {...}
这对我来说是不熟悉的语法。是否只为同一个函数定义两个名称?如果是这样,为什么不将其定义为bar.bi = function()
?
答案 0 :(得分:6)
同时为bi
对象的变量和bar
属性赋值。
这样对象的属性获取值,但您仍然可以将其作为变量引用,这可能会更快一些。
实际上和...一样......
bar.bi = function() {...};
var foo = bar.bi;
foo === bar.bi; // true
或者您可以将其视为......
var foo = ( bar.bi = function() {...} );
因此,bar.bi
的分配首先发生。从赋值表达式返回的结果是相同的函数,并且该结果被分配给foo
。
答案 1 :(得分:1)
除了将函数分配给2变量外,上下文也会根据您调用它的方式而改变。
bar.bi();
将它的上下文作为bar
对象,就好像你会使用它一样:
foo.call(bar);
但是将它从其他变量中删除,就像这样:
foo();
将使用foo
的上下文。因此,如果foo
在全局上下文中,它将等同于:
bar.bi.call(window);
答案 2 :(得分:1)
它只是一个复合作业
var r = x = 3;
将3分配给x,也分配给新申报的r。
您的示例只是用一个函数代替3,一个对象属性 - bar.bi
- 代替x
。
答案 3 :(得分:0)
取决于它的使用位置。
此处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
答案 4 :(得分:0)
var foo = bar.bi = function() {...};
bar.bi === function() {...} //true
foo === bar.bi //true
bar将是响应方法bi的对象。