this 绑定例外之间接引用

Posted lwl0812

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了this 绑定例外之间接引用相关的知识,希望对你有一定的参考价值。

在《你不知道的javascript》之“this全面解析”一节中,讲到了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

注意看最后一行,一开始很难理解,为什么打印出来的是2。

书上的解释如下:

赋值表达式 p.foo = o.foo 返回值是目标函数的引用, 因此调用位置是 foo() 而不是p.foo() 或者 o.foo()。 根据我们之前说过的, 这里会应用默认绑定。 

估计我语文不是很好,所以读了好几遍才明白。

还是用代码来解释上面这段话的意思吧:

function foo () {
  console.log(this.a)
}

var o = {
  a: 3,
  foo: foo
}

var p = {
  a: 4
}

var = 2;

var bar = (p.foo = o.foo); // <-- 注意这里
console.log(bar); // ? foo () {console.log(this.a)} <-- 打印bar,发现执行了 (p.foo = o.foo) 后,会有一个返回值,将该返回值赋值给 bar,打印出来的是全局函数 foo
bar(); // 2 <-- 相当于执行了  (p.foo = o.foo)() ,同上面那段代码中的最后一行

所以 (p.foo = o.foo)() 就相当于执行了 foo() ,此时可应用 this 的绑定规则之一——默认绑定来确定 this 对应的对象,即全局对象,所以 this.a 就是 2。

关于 this 的绑定规则,可参看 《你不知道的JavaScript》之“this全面解析”中的绑定规则一节。

以上是关于this 绑定例外之间接引用的主要内容,如果未能解决你的问题,请参考以下文章

实用代码片段将json数据绑定到html元素 (转)

javascript中的this绑定

一文搞定JavaScript的this指向问题

快速片段切换视图绑定 null

javascript中的this总结

&(引用) 和 *(指针)