this拾遗
22 Sep 2014Bjorn 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
comments powered by Disqus