javascript 闭包的原理

讲闭包前,我会讲下,全局执行环境,块级执行环境,函数执行环境,变量对象,环境栈,作用域链

1.全局执行环境

全局环境就是最顶层的执行环境,也就是window,可以把window当成一个对象,你在window下声明的变量和函数都是window对象的属性和方法;

2.块级执行环境

这个指的就是块级定义区域也就是 { }javascript 闭包的原理

3.函数执行环境

指的就是函数体,函数 { } 内的内容

4.变量对象

上面写的执行环境都有一个变量对象,里面存储着声明的变量和函数,当你调用函数和变量时,都是在这个对象上寻找,当然,这个对象无法直接使用的,你可以在[[scope]]作用域链上查看这个对象与其内容

5.环境栈

当你的函数在被使用时,函数的执行环境就会被推入这个环境栈中,当你的函数执行完毕后,执行环境就会被推出并销毁。如果内部执行环境的变量,被外部执行环境调用,那么内部环境对象就无法被销毁,就是闭包

6.作用域链

作用域链是一个列表,存储着与执行环境相关的变量对象,通过【scope】属性可查看变量对象列表。

javascript 闭包的原理
你想在函数外部访问这个变量x,是无法访问,会报错
要如何才能在函数外部访问这个x呢,这里就用到了闭包
就是那个return 返回的匿名函数,这个就是闭包
javascript 闭包的原理
我将fuck()赋值给shit,shit现在就是等于
javascript 闭包的原理

上面图片我们看到shit的作用域链,[[scopes]]里面就是变量对象,第一个就是fuck函数的变量对象,里面有一个之前定义的x变量,也就是说,现在shit的作用域链的对象里面就带着X这个变量了,我们shit这个函数里面的X就可以使用了,其实就是fuck的的环境对象并没有被销毁了,存在在了shit的作用域链变量对象上了