后来我明白了,我们在 foo
对象上调用警报,该对象有另一个名为 baz
的对象作为其属性,而该对象又有一个名为 的方法>bar
返回 x
的值。由于 lexical scope
(我认为 :)),JS 编译器/解释器沿链向上,在 baz
中找到 x
并返回 1。
我的猜测是当分配给变量 go
然后从全局范围调用时,你得到 3?只是想找出后台发生的事情。任何帮助将不胜感激!!!
var x = 3;
var foo = {
x: 2,
baz: {
x: 1,
bar: function() {
return this.x;
}
}
}
var go = foo.baz.bar;
alert(go());
alert(foo.baz.bar());
最佳答案
当你做这样的事情时:
var go = foo.baz.bar;
go();
你会发现 go
在调用 bar()
之前丢失了对 foo.baz
的引用。它只是一个指向 bar
函数的指针,与它所附加的对象没有任何关联。这意味着当 bar
方法执行时,this
将不是 foo.baz
。
这显然是 .bind()
的开发目的。你可以像这样使用它:
var go = foo.baz.bar.bind(foo.baz);
go();
然后,它将为您工作。您也可以执行相同操作的手动版本:
var go = function() {return foo.baz.bar();}
go();
但是 .bind()
现在已内置到语言中以帮助您解决此类问题。
关于javascript - 为什么返回 3, 1?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28479754/