当前位置: 首页 > Web前端 > JavaScript

JavaScript中闭包的原理

时间:2023-03-26 21:05:02 JavaScript

作用域链VO:变量objectAO:活动对象在讲闭包之前,我们不得不说说作用域链,因为闭包的前提是作用域链的存在。varcolor='red'functionisRed(){returncolor==='red'}console.log(isRed())//true大家都知道因为作用域链,我们可以访问变量对象(全局对象)属性,但其背后的原理是什么?首先:浏览器会在预编译阶段创建一个VO对象,VO对象会包含全局的方法和属性。如果遇到一个方法,它会将当前作用域链(scopechain)传递给方法的[[Scope]]。域链决定了函数的上下文和执行顺序。解析完成后,面临isRed方法的执行。执行该方法时,浏览器会为当前函数创建一个AO对象。在AO对象中,它的this指向window(严格模式下未定义),同时返回一个值。.补充:每次执行也是一个上下文,会复制定义时的[[Scope]],将当前上下文压入其中,并放在栈顶。闭包说完作用域链,就到了我们的话题,闭包。调用函数时,浏览器为函数创建执行上下文,创建执行上下文,创建作用域链。当我们有函数嵌套时,内部函数引用外部函数的变量,就会产生一个闭包。但是生成闭包的原理呢?直接上代码!!!functionmyClosure(){vara=1returnfunction(){++areturna}}varmyclosure=myClosure()console.log(myclosure())//2console.log(myclosure())//3首先,浏览器会在预编译阶段创建一个VO对象,其中会包含全局的方法和属性。如果遇到一个方法,它会将当前的作用域链传递给方法的[[Scope]](作用域链),作用域链决定了函数的上下文和执行顺序。执行myClosure方法创建一个AO对象。在AO对象中,它的this指向window,同时会返回一个值。因为return是一个函数,方法的[[Scope]]会在预编译阶段被预装。转到当前作用域链,即myClosure的全局上下文和函数上下文。执行myclosure方法创建myclosure的AO对象。对象的this指向window。同时,因为使用了myClosure函数的AO对象,在内存中保存了一个变量的引用(Closure指向myClosure),所以myClosure在执行完成时应该销毁的函数上下文没有。因此,创建了一个闭包。以上内容是我结合书本和实践,我的理解肯定有不妥,甚至是错误的。欢迎评论!!!