一个闭包的问题

function count() {
    var arr = [];
    for (var i=1; i<=3; i++) {
        arr.push((function (n) {
            return function () {
                return n * n;
            }
        })(i));
    }
    return arr;
}

var results = count();
var f1 = results[0];
var f2 = results[1];
var f3 = results[2];

f1(); // 1
f2(); // 4
f3(); // 9

请问count函数的返回值是 n*n吗?
results拿到的是count里的哪段代码?
这段代码看的头好大啊,自动执行函数不是(function(){})吗?为什么还有一个(i)??

arr.push((function (n) {return function (){return n * n;}})(i));

(function(){})())这个也是自动执行函数的样式吗?

阅读 2.5k
4 个回答

1 count函数的返回值是一个数组,看人家的代码,定义了一个arr,return arr。也就是说results拿到了返回的数组
2 然后看循环的代码。

首先看:arr.push()。每做一次循环,向数组中添加一个元素
然后看:(function (n) {return function (){return n * n;}})(i)
    第一:自执行一般有两种方式
        1(function 可以加name(形参){code}(调用,传递实参))
        2 (function 可以加name(形参){code})(调用,传递实参)
        上面也就是用的2,2比较常见
    第二:看上面的代码,自执行函数返回了一个函数,这个返回的函数的返回的值是n*n(注意这里还没有调用),也就是说每        一次向数组中添加的是一个函数
    第三:为什么要将i传递给n,这就是闭包的问题。我不知道这里你清不清楚

返回的就是个数组,你执行一个函数传参难道不是 fun(1) 这和(function(s){})(1) 有什么区别么

count函数的返回值是arr这个数组,results拿到的就是arr数组,自动执行函数不是(function(){}),本来就该是(function(){}())或者(function(){})(),括号里面可以传参进去

  1. count() 返回的是 arr, results 的值就是 arr
  2. (function(i/* 接受参数 */){})(/* 参数 */)
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题