xxleyi / learning_list

聚集自己的学习笔记
10 stars 3 forks source link

The "this" in JavaScript depends on the way of the function's invocation, but WHY? #203

Open xxleyi opened 4 years ago

xxleyi commented 4 years ago

大多数学习 JS 的朋友,在对 this 进行一番学习之后,终于体认到一个事实:The "this" in JavaScript depends on the way of the function's invocation.

但是,估计很多朋友也仅仅只是知道 HOW 而不知道 WHY。不是吗?

你知道为什么吗?

这篇笔记意在指明这个 WHY,让所有的 HOW 成为一件显而易见的事情。

xxleyi commented 4 years ago

先让我们明确 how

总则:this 取决于一个函数被怎样调用(不考虑 strict 模式,感兴趣的可以自己查资料)。此外,箭头表达式函数中,this 遵守普通的词法作用域规则,也就是说:箭头表达式函数中的 this 取决于函数被定义的那个环境当中的 this

以下针对普通函数:

一篇绝佳的博客:Gentle Explanation of "this" in JavaScript

xxleyi commented 4 years ago

然后,让我们去探究背后的 why

为什么 JS 中的 this 被设计成这样?

或者说 JS 中的 this 是为了解决什么问题?

先从一个比 how 更基本的问题入手:this 究竟是什么?

所以,this 应该是一个变量,更准确地说,是一个标志符。

那么,关于标志符,关于变量,又能有什么更多的信息呢?

this 作为标志符,肯定会在某个时刻被赋值。那么,是谁在什么时候什么地方对 this 进行赋值的呢?

作为 what 的 this 先到此为止,继续思考 this 的用途:

JS 中函数是一个对象,有很多内置方法,比如 apply call bind 和 toString,然后,其内部会出现一个 this 变量,且 this 变量会根据函数对象被调用方式的不同而被赋予不同的值。

所以,背后隐约出现一个庞大的身影:是靠什么机制来决定 this 的值?

问到这里,靠自己的力量很可能找不到答案。

但,在某一天,我从其他地方获知了 JS 运行时,执行上下文,环境记录的存在和机制时,关于 this 的这些问题终于不再是问题。

是的,this 的背后是一个更大的东西,那个更大的东西值得每一位 JS 工程师掌握。

简而言之:JS 给函数对象的词法环境添加了几个独特的行为,其中包括 this,这几个独特行为构成 JS 面向对象机制解决方案的根基。