Categories
程式開發

两分钟给你讲清楚JavaScript中的闭包与this


如果没有学过其他语言就学习JavaScript,那么大概率会先学习作用域链,然后觉得内层函数可以访问外层函数中的变量理所当然,以至于很难接受this动不动就指向全局。

但在其他语言里并不是这样,this的操作才是常态,作用域链才难以接受。理由见下图红圈中部分,内容截取自《JavaScript权威指南》

两分钟给你讲清楚JavaScript中的闭包与this 1

《权威指南》的作者把作用域链的概念放到了靠前的位置,结果导致初学编程者产生了与前人相反的困惑。

其实问题并不在两个概念出现的顺序上。它们分别有各自的用途,也都很合理,只是作者没讲清楚。

要搞明白很简单,一个概念就能把两个看似相对的概念联系起来,即: 

函数的声明和调用是分离的,是两回事。

函数内变量和函数声明时所处的环境(调用上下文)有关,即作用域链。而this指针适合函数调用时所处的环境(调用上下文)有关,但还有一个需要注意的点是: JavaScript中环境即当前对象包含的所有变量。如果一个函数不直接属于某个对象的属性,那该函数便属于全局对象,这就是this动不动就指向全局对象的原因,如果我们要在某个环境下调用函数,那就把该函数给对象复制一份。

初学编程,如有错误,欢迎指正。