effective js-13-立即执行的函数创建局部作用域

<!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>

猜你喜欢

转载自mumu-shoucang.iteye.com/blog/2281029