我刚读这本书,#34;你不认识JS"凯尔辛普森,并遇到了以下有些困惑我的代码。基本上我正在阅读关于this
关键字的主题。以下是摘录:
function foo() {
console.log( this.a );
}
var a = 2;
var o = { a: 3, foo: foo };
var p = { a: 4 };
o.foo(); // 3
(p.foo = o.foo)(); // 2
到目前为止阅读这本书时,我确实理解了这是如何工作的,但对我来说,很难理解最后一行代码中是否真的发生了什么。
如果我自己分析它的最后一行是iffe在全局范围内执行,并且如果在iffe中foo()函数执行,则foo()函数中的this.a将指向全局范围中的a ,确实是2。
但不知何故,我不觉得我完全理解最后一行发生的事情,有人可以为我分解吗?
谢谢。
亚历山大。
答案 0 :(得分:5)
最后一行是传递给foo
函数的引用,然后在全局范围内执行,就像你看到的那样。它相当于这个
var f = p.foo = o.foo;
f();
答案 1 :(得分:2)
赋值的返回值始终是值本身。在此示例中,返回值是对函数 foo 的引用。因此,在一行上执行两个步骤。
p.foo = o.foo;
foo();
答案 2 :(得分:0)
这是最新发生的事情:
当调用(p.foo = o.foo)();
时,JS会将其转换为
function foo() {
console.log( this.a );
}
并且由于var a = 2
在全局范围内设置,并且没有任何内容传递给该函数,因此您的结果为2
那么问题是为什么JS将(p.foo = o.foo)
转换为foo()
函数?
p.foo = o.foo
:这是从右到左分配变量。就像var a = "something";
一样,这意味着现在,p.foo
等于o.foo
,而o.foo
等于foo
,我们现在正在说p.foo = foo
,换句话说:
(p.foo = o.foo)();
与(foo)()
相同,后者运行foo
函数。
进一步解释:
console.log(p.foo); //returns undefined because nothing was set to it
console.log(o.foo); //returns foo, because it was assigned var o = {foo: foo};
p.foo = o.foo; // this assignes foo to p.foo
console.log(p.foo); //returns foo, it is no longer undefined, because of our assignment
(p.foo)(); // will run the function
我之前收到undefined
时遇到了问题,但那是因为我在http://jsfiddle.net/上运行测试,导致我无法正常访问我的功能。