对于初学者来说接触javascript可能会有一些困难,本人是在回顾之前的知识以后才对这个概念有了一些自己的理解,所以今天也将自己的一些理解记录下来,本人第一次写文章,不喜勿喷,后续大部分的文章都与作用域链有关,所以这是一个很重要的概念。
作用域链
大家都知道,JavaScript跟许多程序设计语言都不太一样,它不存在大括号级的作用域(不包括ES6),但是它有函数作用域,也就是说,在函数内定义的变量在函数外部是不能被访问的,但是如果该变量是在某个代码块中定义的(如 if/for语句中),它在代码块外是可以被访问的。
1 | var a = 1; |
在这里,变量a是属于全局作用域的,而变量b的作用域就在函数f()内了,所以,也就印证了上面我们说的是没有错的。
另外,如果我们在函数f()中定义了另外一个函数n(),那么,在函数n()中可以访问的变量可以是来自他自身的作用域,也可以来自其”父级”(f())的作用域,这也就形成了一条作用域链,该链的长度取决于我们具体的需求。
1 | var a = 1; |
词法作用域
在javascript中,每一个函数都有一个自己的词法作用域,也就是说,每个函数在定义的时候(非执行时)都会创建一个属于自己的环境(即作用域)。
1 | function f1(){ |
在上面的代码中,我们在函数f1()中调用了函数f2(),由于局部变量a也在f1()中,所以我们可能会认为函数f2()是能够访问a的,但是事实不是这样,因为当函数f2()被定义的时候,变量a是不可见的,和函数f1()一样,它那个时候只能访问自身作用域和全局作用域中的内容,也就是说,这里的f1()和f2()之间不存在共享的词法作用域,所以,接下来就可以利用闭包这个机制来突破作用域链,至于闭包详解篇,下篇在分享,再声明一次,本人第一次写文章,欢迎大牛指正。