理解JavaScript闭包:访问外部变量的原理与应用
版权申诉
19 浏览量
更新于2024-09-12
收藏 142KB PDF 举报
本文主要探讨了JavaScript中的闭包函数如何访问外部变量,通过示例解释了闭包只能获取外部变量的最后状态,并提供了解决方案,确保每个闭包函数能够记住其创建时的变量值。
在JavaScript中,闭包是一种特殊的作用域结构,允许函数访问并操作其外部作用域中的变量,即使在其外部函数已经执行完毕后。然而,一个需要注意的点是,闭包只能访问到外部变量的最后一次值。以下是一个简单的示例:
```javascript
function create() {
var arr = new Array();
for (var i = 0; i < 10; i++) {
arr[i] = function() {
return i;
};
}
return arr;
}
var c_arr = create();
for (var i = 0; i < c_arr.length; i++) {
document.write("c_arr[" + i + "]=" + c_arr[i]() + "<br/>");
}
```
在这个例子中,期望的结果是每个函数返回不同的值,从0到9。但实际上,所有函数都返回10,因为它们共享同一个`i`变量,而`i`在for循环结束后变为10。
为了达到预期的效果,我们可以创建一个新的函数,将外部变量的当前值作为参数传入,从而为每个闭包函数创建一个独立的变量副本:
```javascript
function create() {
var arr = new Array();
for (var i = 0; i < 10; i++) {
arr[i] = (function(num) {
return function() {
return num;
};
})(i);
}
return arr;
}
var c_arr = create();
for (var i = 0; i < c_arr.length; i++) {
document.write("c_arr[" + i + "]=" + c_arr[i]() + "<br/>");
}
```
现在,每个闭包函数都有它自己的局部变量`num`,它保存了`i`在循环中的当前值。这样,每次调用`c_arr[i]()`,都会返回对应的`num`值,从而实现预期的效果。
这个概念在实际编程中非常有用,特别是在处理异步操作或者需要保留状态的情况下。例如,当我们需要为一组按钮绑定点击事件,而每个按钮需要显示不同的信息时,可以利用闭包来保留每个按钮的索引或其他相关数据,确保每个按钮点击时显示正确的内容。
总结来说,JavaScript中的闭包函数能访问并修改外部作用域的变量,但要注意它们只保留变量的最后状态。通过立即执行的匿名函数和参数传递,我们可以创建独立的闭包环境,确保每个闭包能记住其创建时刻的变量值。掌握这一特性对于编写高效且健壮的JavaScript代码至关重要。
2021-12-29 上传
204 浏览量
138 浏览量
2024-06-13 上传
点击了解资源详情
点击了解资源详情
点击了解资源详情
点击了解资源详情
点击了解资源详情
weixin_38501810
- 粉丝: 2
- 资源: 942
最新资源
- SQLserver定时备份存储过程
- Oracle9i 数据库设计指引全集
- 建立ARM-Linux交叉编译环境
- 嵌入式系统及硬件基础.ppt
- Linux系统移植(讲得很详细)
- LZW编码 已知:带压缩的数据文件1、 使用编程语言:C++2、 输入:任意的数据文件3、 输出:压缩后的数据文件4、 源程序格式要整齐清晰,注释简单明了。
- wm8731-pdf
- 驱动程序开发.ppt
- 轻松进入STM32+Cortex-M3世界
- 基本算法正式稿pascal
- WEB程序设计课件第一章
- C/C++高质量编程(林锐)
- 单片机实现交通灯控制
- 费诺编码输入为 7个信源符号,其概率分布为:(其中信源符号用A B、、G表示)A:0.2 B:0.19 C:0.18 D:0.17 E:0.15 F:0.10 G:0.01然后输入程序中得到结果(详细文档,值得一下)
- C#编程语言与面向对象基础教程
- 使用STM32的软件库在IAR的EWARM下进行应用开发