JS——闭包中关于函数数组的问题

来源:互联网 发布:淘宝睡衣退款率 编辑:程序博客网 时间:2024/05/22 01:56

JavaScript中闭包是一大关键点,书上认为闭包是指有权访问另一个函数作用域中的变量的函数。创建闭包的常见方式就是在一个函数内部创建另一个函数。

由于在JavaScript语言中,只有函数内部的子函数才能读取局部变量,因此可以把闭包简单理解成"定义在一个函数内部的函数"。

所以,在本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁。

我按照书上的例子,却久久不能实现。。。

错误的写法:

<!DOCTYPE html><html><body><script type="text/javascript">function createFunctions() {var result = new Array();for(var i=0;i<10;i++) {result[i] = function() {return i;};}return result;}var arr = createFunctions();alert(arr);</script></body></html>


错误原因:这里返回的result数组其实是函数数组。由于result[i] = function(){...};

所以这时候不能alert(arr);

修正的代码:

<!DOCTYPE html><html><body><script type="text/javascript">function createFunctions() {var result = new Array();for(var i=0;i<10;i++) {result[i] = function() {return i;};}return result;}var arr = createFunctions();for(i=0;i<10;i++) {alert(arr[i]());}</script></body></html>

附上另一段代码,比较清晰的证明了闭包和作用域的问题:

<!DOCTYPE html><html><body><script type="text/javascript">function f1(){    var n=999;    nAdd=function(){n+=1}    function f2(){      alert(n);    }    return f2;  }  var result=f1();  result(); // 999  nAdd();  result(); // 1000</script></body></html>

nAdd是一个全局变量,等于一个匿名函数,这个匿名函数即闭包。

0 0
原创粉丝点击