首页 > 闭包与变量

闭包与变量

function createFunctions () {

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

为什么调用了这个函数确没有任何效果,应该怎样去调用才能显示 result数组?


其实现在createFunctions()函数已经返回了result数组,而result数组的每个元素都是一个函数,这个函数都会打印出当前元素的索引值,你只调用createFunctions()函数,没有调用result数组元素对应的函数,所以你看不到任何效果


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

贴个完整的

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

一个function后面直接()执行,是没有意义的;
要直接调用可以让左边成为一个表达式。比如:

+function(){}();
~function(){}();
(function(){})();

再次,你所要的闭包就是包含在函数内部的一个引用了自由变量被返回的一个function。


我不明白了,如果只是给 result 赋值,为什么要创建个闭包绕那么大个圈呢。其实就是个等于啊~

function createFunctions () {
    var result = new Array();
    for(var i=0;i<10;i++){
        // 直接赋值就好了,有什么好犹豫的呢?
        result[i] = i;
    }
    return result;
}
createFunctions();

假如真的有需求在循环里创建闭包,正确的姿势如下:

for (var i = 0; i < 10; i++) {
  (function(i) {
    // 假设这是一个异步调用,会在未来某个时间回调传入的函数
    asyncCall(function() {
      // 在这里可以安全的使用 i
      // 如果不这样写,这个闭包里面使用的 i 将始终是 i 的最终值:10
    });
  })(i);
}

function createFunctions () {

    var result = new Array();
    for(var i=0;i<10;i++){
        result[i] = function(num){
            return function(){
                return num;
            };
        }(i);
    }
    return result;
}
var arr = createFunctions();
for(var i = 0; i < arr.length; i++){
    console.log(arr[i]())
}

这样就能显示你想要的result数组结果了。
不过,这样做没有一点意义。完全不是闭包所提倡的。


这个是高级设计的例子吧

【热门文章】
【热门文章】