作用域分类
- 全局作用域
- 函数作用域
- 块作用域(ES6新增的)
注意:作用域在JS里也叫“词法环境”
词法环境分为2种:
一种是创建时的词法环境,另一种是执行时的词法环境
作用域链
由于执行时的词法环境里面有个outer变量总指向创建时的词法环境,
所以会使作用域产生一条链式
1、全局创建时 ---> 生成全局创建时的词法环境为null
2、全局代码执行时 ---> 生成全局执行时的词法环境为window(一般),并把全局执行时的词法环境的outer指向全局创建时的词法环境(null)
3、当执行的代码遇到函数声明或函数表达式 ---> 生成函数创建时的词法环境,并指向全局执行时的词法环境
4、当函数被调用时 ---> 生成函数执行时的词法环境,并把函数执行时的词法环境的outer指向函数创建时的词法环境
上面讲了一大堆,来张图好理解
图中的黑线就是作用域链,内层作用域中如果没有所需的变量时,就会不断往外层作用域找变量
闭包
闭包是面试时,必考的一个知识点,听起来很抽象,但其实很容易说明白
- 闭包是什么?
其实闭包就是基于作用域链产生的一个概念,原本一个函数执行完,函数
内部的变量就会完全从内存中销毁掉,但闭包出现后,哪怕函数执行完,
里面的变量都不会销毁,还是保留在内存中,还能使用闭包(函数)进行访问
一句话:**闭包是一个能够操作另外一个函数内部的变量的函数**
- 闭包如何产生?
1、函数内再套函数
function a(){
var b = 111;
// c就是闭包
function c(){
b++;
alert(b);
}
return c;
}
2、内部函数读写外部函数内的局部变量
- 闭包有什么好处
1、减少全局变量污染 (是减少,而不是消除)
2、封装
3、闭包操作外层函数的变量是引用,而不是拷贝
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。