高程中的闭包

function createFunctions() {
    var result = new Array();
    for(var i =0; i<10; i++){
        result[i] = function(){
                return i;
        };
    }
    return result;
}

alert(createFunctions());
alert(result[1]());
alert(createFunctions()[1]());

function createFunctions() {
    var result = new Array();

    for(var i =0; i<10; i++){
        result[i] = function(num){
            return function(){
                return num;
            };
        }(i);
    }
    return result;
}

alert(createFunctions());
alert(createFunctions()[]);

问题1:这两个函数应该如何调用,为什么我都调用不对。。。。函数1应该看到10; 函数2应该看到0,1,2......9
问题2:为什么函数2立即调用就能产生0-9的输出结果。

阅读 2.6k
3 个回答

函数一,你输出createFunctions()[1]()都会得到10吧,无论中括号内多少,都得到10,没用闭包,变量不会保存
函数二调用方式同上,不过中括号里输几,拿到当前数字,内存没有销毁这个变量

亲爱的题主,让我来解答您的问题吧。
1.首先回答您的第一个问题。
您的两个函数都调用不对,第一个是因为 alert(result[1]());报错。因为您在全局没有定义result这个变量。
第二个报错是alert(createFunctions()[]);因为您这样写语法就有错误,素组操作应该传个下标的。
2.回答您的第二个问题。
【为什么函数2立即调用就能产生0-9的输出结果。?】
因为函数2里面的for循环应用了闭包,将外面的 i变量传到一个立即执行的匿名函数中,这个匿名函数对形参值进行了保存。(相当于保存了一个小环境。其实就是闭包的用途)

function createFunctions() {
    var result = new Array();
    for(var i =0; i<10; i++){
        result[i] = function(){
                return i;
        };
    }
    return result;
}

// 这样调用返回一个数组,数组的每一项都是一个自定义的函数
alert(createFunctions());

// result是局部变量,不能在外直接访问,因此报错
alert(result[1]());

// 访问数组中的第2个元素,并执行,执行结果为10
alert(createFunctions()[1]());

function createFunctions() {
    var result = new Array();

    for(var i =0; i<10; i++){
        result[i] = function(num){
            return function(){
                return num;
            };
        }(i);
    }
    return result;
}

// 该函数调用返回一个数组,数组的每一项都是一个自定义的函数
alert(createFunctions());

// 你要访问数组的具体子项,应该带上索引值  createFunctions()[1]
alert(createFunctions()[]);
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题