带你读《现代Javascript高级教程》——执行上下文与闭包(2)https://developer.aliyun.com/article/1347051?groupCode=tech_library
在这个例子中,当调用outerFunction时,会创建一个新的执行上下文,其中包含了outerVariable参数和innerFunction函数声明。然后,outerFunction返回了innerFunction,并将其赋值给变量newFunction。
现在让我们来看看闭包是如何形成的。当innerFunction被返回时,它会携带其词法环境(包含outerVariable)一起返回。这意味着innerFunction保持对outerVariable的引用,即使outerFunction执行完毕并且其执行上下文已经销毁。
这就是闭包的力量所在。它允许内部函数(innerFunction)访问其词法环境中的变量(outerVariable),即使这些变量在其创建时的执行上下文已经不存在。
在这个例子中,newFunction就是一个闭包。它引用了外部函数outerFunction的词法环境,其中包含了outerVariable变量。因此,当我们调用newFunction时,它可以访问并打印出outerVariable和innerVariable的值。
执行上下文和闭包的关系是密不可分的。闭包是由执行上下文中的变量引用形成的,而这些变量保留在闭包的作用域中。这使得闭包能够在函数执行完成后继续访问这些变量,实现了JavaScript中非常重要的特性。
理解执行上下文和闭包的交互对于编写复杂的JavaScript代码非常重要。它有助于我们更好地理解作用域、变量的生命周期以及如何正确使用闭包来解决问题。同时,它也帮助我们避免一些潜在的问题,如内存泄漏和不必要的资源消耗。
4. 闭包的应用场景
闭包在JavaScript中有广泛的应用场景,它是一种强大的编程工具,可以解决许多常见的问题。下面我们来介绍一些常见的闭包应用场景。
1) 数据封装和私有性
闭包可以用于创建私有变量,将变量隐藏在函数作用域内部,从而实现数据的封装和私有性。通过闭包,我们可以控制变量的访问权限,只暴露需要暴露的接口。这种封装机制可以防止外部代码直接访问和修改内部数据,增加代码的安全性。
function createCounter() { let count = 0; return { increment: function () { count++; }, decrement: function () { count--; }, getCount: function () { return count; } };} const counter = createCounter(); counter.increment(); counter.increment(); console.log(counter.getCount()); // 输出: 2
在这个例子中,createCounter函数返回一个对象,该对象包含了三个闭包函数,分别用于增加计数、减少计数和获取计数值。通过闭包,我们可以将count变量隐藏在函数内部,并通过闭包函数来操作和访问这个变量。
带你读《现代Javascript高级教程》——执行上下文与闭包(4)https://developer.aliyun.com/article/1347051?groupCode=tech_library