计算机世界最聪明的地方就在于它是人为的,最愚蠢的地方也正在于此。
——我瞎写的
已经有太多学习前端的人困于这个无聊的概念了。JavaScript 本就是脱胎于 Java 和 C 的语言,所以这个概念大概只能从 Java 得出。由于 Java 是纯粹的面向对象语言,this
用来指代当前的类实例。而 JavaScript 先天缺乏 OO 的概念,所以可以说this
被异化了。因为 JavaScript 是一等函数,函数本身就是和类同样的存在,这样一来其外部调用环境是完全不确定的。所以这将得到规范里的一条约定:
The this keyword evaluates to the value of the ThisBinding of the current execution context.
这说明this
绑定的是上下文(而不是作用域,因为上下文是动态的)。我之前看到了别人的文章从规范的角度去看这个问题:
github.com/mqyqingfeng…
但总觉得差点意思。毕竟规范是设计的结果,而不是设计的过程。所幸阮一峰老师在去年刚写了一篇文章来从我更欣赏的角度分析这个问题:
www.ruanyifeng.com/blog/2018/0…
他指出了一个关键是,一等函数相当于直接指向内存的函数指针。这可以解释另一个例子:
var value = 1;
var foo = {
value: 2,
bar: function () {
return this.value;
}
}
console.log((false || foo.bar)()); // 1
复制代码
此时 foo.bar 其实已经被计算(evaluate)了,所以相当于直接于调用一等函数。
PS:这里一等函数是为了说明那些函数可以单独运行而不需要从类进行访问。