22 Sep 2014

this拾遗

Bjorn Tiplingy写过一篇JavaScript中关于this关键字的有趣的文章. 尽管这篇文章中解析了this显露自身的很多不同的方式, 但是它真的很长, 而且我认为它从错误的方向进行了说明, 导致对于简单理论的过于复杂的说明.

问题在于说明是基于如下问题的: “我写的这段代码中this是什么?”

JavaScript的工作方式是, this关键字并不是代码中定义时, 而是在运行时, 正因如此使得上述问题变得没有了意义. 这类似于描述:就木材种类而言, 如何将其与使用锤子联系起来: 你或许可以列出一个有用的列表, 但是它不会是很详尽的, 并且在关于理解锤子上, 它不会带给你很多帮助.

每当需要向人们解释this时, 我会按如下解释:

  • this就是被调用方法的句号修饰符前面的部分
  • 如果没有句号修饰符, this就是全局对象global(或者严格模式strict mode下的undefined)
  • 如果函数已经被显式绑定(使用call, apply或者bind), 它优先于上述规则.
  • 如果函数通过new关键字调用, this指向一个对象, 此对象的原型为函数的原型属性.

就这么简单.

为了继续解释Jquery如何在它的方法中设置的this等. 要描述类库实现的细节. 只需要了解它可以被类库作者定义就够了 - 实际的细节应该参见类库文档.

因此我劝大家去尝试并避免基于其他语言实现方式来考虑这个问题. 尽管其它语言在特定的情况下, this的工作原理与之类似, 但是以此为出发点是错误的, 因为你将会有很多类似这样的规则: “喔!但在X情况下是Y”.

如果以如下(正确的)假设开始: this是在调用期被定义, 而不是编码期. 它可能会变的更易于理解.

原文地址: some of this


Tags:
0 comments