Heim  >  Fragen und Antworten  >  Hauptteil

javascript - 闭包与变量

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数组?

阿神阿神2749 Tage vor370

Antworte allen(6)Ich werde antworten

  • 巴扎黑

    巴扎黑2017-04-10 14:32:07

    我不明白了,如果只是给 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);
    }
    

    Antwort
    0
  • PHP中文网

    PHP中文网2017-04-10 14:32:07

    贴个完整的

    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。

    Antwort
    0
  • 怪我咯

    怪我咯2017-04-10 14:32:07

    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数组结果了。
    不过,这样做没有一点意义。完全不是闭包所提倡的。

    Antwort
    0
  • 高洛峰

    高洛峰2017-04-10 14:32:07

    这个是高级设计的例子吧

    Antwort
    0
  • 天蓬老师

    天蓬老师2017-04-10 14:32:07

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

    Antwort
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-10 14:32:07

    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();

    Antwort
    0
  • StornierenAntwort