在javascript中间接引用函数

时间:2015-02-19 14:42:35

标签: javascript

我刚读这本书,#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。

但不知何故,我不觉得我完全理解最后一行发生的事情,有人可以为我分解吗?

谢谢。

亚历山大。

3 个答案:

答案 0 :(得分:5)

最后一行是传递给foo函数的引用,然后在全局范围内执行,就像你看到的那样。它相当于这个

var f = p.foo = o.foo;
f();

答案 1 :(得分:2)

赋值的返回值始终是值本身。在此示例中,返回值是对函数 foo 的引用。因此,在一行上执行两个步骤。

  1. p.foo = o.foo;
  2. 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/上运行测试,导致我无法正常访问我的功能。