带你读《现代Javascript高级教程》——执行上下文与闭包(1)https://developer.aliyun.com/article/1347051?groupCode=tech_library
在这个例子中,outerFunction是一个外部函数,接受一个参数outerVariable。它包含一个内部函数innerFunction,这个内部函数没有自己的参数或局部变量,但却引用了外部函数的变量outerVariable。所以,我们说innerFunction是一个闭包,而outerVariable就是它的自由变量。
需要注意的是,由于JavaScript的垃圾回收机制,如果一个变量离开了它的作用域,那么这个变量就会被回收。但是,由于innerFunction是一个闭包,它引用了outerVariable,所以即使outerFunction执行完毕,outerVariable离开了它的作用域,但仍然不会被垃圾回收机制回收。
再者,每次调用外部函数,都会为内部的闭包创建一个新的作用域。例如:
var inner1 = outerFunction('Hello Closure 1'); var inner2 = outerFunction('Hello Closure 2'); inner1(); // 输出 'Hello Closure 1' inner2(); // 输出 'Hello Closure 2'
这里,inner1和inner2是两个不同的闭包。他们分别有自己的作用域,储存了不同的outerVariable。
1. 执行上下文与闭包
在JavaScript中,执行上下文(execution context)是一个关键概念,与闭包(closure)密切相关。理解执行上下文如何与闭包交互可以帮助我们深入理解闭包的工作原理和行为。
执行上下文是JavaScript代码执行时的环境。它包含了变量、函数声明、作用域链等信息,用于管理和跟踪代码的执行过程。当一个函数被调用时,就会创建一个新的执行上下文。每个执行上下文都有自己的词法环境(Lexical Environment),用于存储变量和函数的声明。
在理解闭包之前,让我们先了解一下执行上下文的创建和销毁过程。当函数被调用时,会创建一个新的执行上下文,并将其推入执行上下文栈(execution context stack)中。当函数执行完毕后,其执行上下文会从栈中弹出并销毁。
现在,让我们通过一个例子来更具体地了解执行上下文和闭包之间的关系:
function outerFunction(outerVariable) { function innerFunction(innerVariable) { console.log('outerVariable:', outerVariable); console.log('innerVariable:', innerVariable); } return innerFunction;} var newFunction = outerFunction('outside');newFunction('inside'); // 输出: outerVariable: outside innerVariable: inside
带你读《现代Javascript高级教程》——执行上下文与闭包(3)https://developer.aliyun.com/article/1347051?groupCode=tech_library