为什么 JavaScript 的 this 要这么用?

计算机世界最聪明的地方就在于它是人为的,最愚蠢的地方也正在于此。
——我瞎写的

已经有太多学习前端的人困于这个无聊的概念了。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:这里一等函数是为了说明那些函数可以单独运行而不需要从类进行访问。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值