两分钟给你讲清楚 JavaScript 中的闭包与 this
如果没有学过其他语言就学习JavaScript,那么大概率会先学习作用域链,然后觉得内层函数可以访问外层函数中的变量理所当然,以至于很难接受this动不动就指向全局。
但在其他语言里并不是这样,this的操作才是常态,作用域链才难以接受。理由见下图红圈中部分,内容截取自《JavaScript权威指南》
《权威指南》的作者把作用域链的概念放到了靠前的位置,结果导致初学编程者产生了与前人相反的困惑。
其实问题并不在两个概念出现的顺序上。它们分别有各自的用途,也都很合理,只是作者没讲清楚。
要搞明白很简单,一个概念就能把两个看似相对的概念联系起来,即:
函数的声明和调用是分离的,是两回事。
函数内变量和函数声明时所处的环境(调用上下文)有关,即作用域链。而this指针适合函数调用时所处的环境(调用上下文)有关,但还有一个需要注意的点是: JavaScript中环境即当前对象包含的所有变量。如果一个函数不直接属于某个对象的属性,那该函数便属于全局对象,这就是this动不动就指向全局对象的原因,如果我们要在某个环境下调用函数,那就把该函数给对象复制一份。
初学编程,如有错误,欢迎指正。
版权声明: 本文为 InfoQ 作者【在沉默中】的原创文章。
原文链接:【http://xie.infoq.cn/article/9510e92948700c55323df496c】。文章转载请联系作者。
评论