<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>立即执行的函数创建局部作用域</title>
</head>
<body>
<script>
/*******第三点(闭包存储的是外部变量的引用,而非值的副本)**************/
function wrapEle(ary) {
var ret = [], i, n;
for(i = 0; i < ary.length; i++) {
ret[i] = function() {
return ary[i];
};
}
alert("i: " + i); // 3
return ret;
}
var wrapped = wrapEle([1, 2, 3]);
var f = wrapped[0];
var v = f(); // 实际上执行的是 function() {return ary[3]};
// 存储的是外部变量i的引用,外部方法执行完成后,i = 3;
alert(v); // undefined
/******解决方法-立即执行的函数创建局部作用域*********/
function wrapEle1(ary) {
var ret = [], i, n;
for(i = 0; i < ary.length; i++) {
(function(j) {
ret[i] = function() {
return ary[j];
}
})(i);
}
alert("i: " + i); // 3
return ret;
}
var wrapped1 = wrapEle1([1, 2, 3]);
var f1 = wrapped1[0]; // 实际上执行的是 function() {return ary[0]};
alert(f1()); // 1
</script>
<p>
关于闭包(立即执行函数创建局部作用域)必须知道的是,
1. 闭包可以更新外部变量的值,实际上,闭包存储是外部变量的引用,而不是外部变量值的副本
2. 代码块中不能包括break语句和continue语句
3. 如果代码块中引用了this或arguments变量,它们的含义将会改变
</p>
</body>
</html>