JS 作用域、作用域链、闭包

作用域分类

  1. 全局作用域
  2. 函数作用域
  3. 块作用域(ES6新增的)
注意:作用域在JS里也叫“词法环境”
词法环境分为2种:
一种是创建时的词法环境,另一种是执行时的词法环境

作用域链

由于执行时的词法环境里面有个outer变量总指向创建时的词法环境,
所以会使作用域产生一条链式

1、全局创建时 ---> 生成全局创建时的词法环境为null
2、全局代码执行时 ---> 生成全局执行时的词法环境为window(一般),并把全局执行时的词法环境的outer指向全局创建时的词法环境(null)
3、当执行的代码遇到函数声明或函数表达式 ---> 生成函数创建时的词法环境,并指向全局执行时的词法环境
4、当函数被调用时 ---> 生成函数执行时的词法环境,并把函数执行时的词法环境的outer指向函数创建时的词法环境

上面讲了一大堆,来张图好理解
JS 作用域、作用域链、闭包_第1张图片

图中的黑线就是作用域链,内层作用域中如果没有所需的变量时,就会不断往外层作用域找变量

闭包

闭包是面试时,必考的一个知识点,听起来很抽象,但其实很容易说明白
  • 闭包是什么?
其实闭包就是基于作用域链产生的一个概念,原本一个函数执行完,函数
内部的变量就会完全从内存中销毁掉,但闭包出现后,哪怕函数执行完,
里面的变量都不会销毁,还是保留在内存中,还能使用闭包(函数)进行访问

一句话:**闭包是一个能够操作另外一个函数内部的变量的函数**
  • 闭包如何产生?
1、函数内再套函数

function a(){
    var b = 111;
    // c就是闭包
    function c(){
        b++;
        alert(b);
    } 
    return c;
}

2、内部函数读写外部函数内的局部变量
  • 闭包有什么好处
1、减少全局变量污染 (是减少,而不是消除)
2、封装
3、闭包操作外层函数的变量是引用,而不是拷贝

你可能感兴趣的:(javascript,前端,作用域链,闭包)