javascript - Der for-Schleifendruck, den ich im let-Befehl in der ES6-Standardeinführung erwähnt habe, ist 10. Wie kann ich ihn ohne let ersetzen?
阿神
阿神 2017-06-28 09:22:57
0
4
829

Kürzlich habe ich die Einführung in ES-Standards von Lehrer Ruan Yifeng gelesen und als ich das erste Kapitel gelesen habe, habe ich einen Code erwähnt

var a = []; for (var i = 0; i < 10; i++) { a[i] = function () { console.log(i); }; } a[6](); // 10

Die Verwendung von let hier kann dieses Problem lösen, aber was ist, wenn wir die ES5-Methode verwenden? IIFE kann es, aber es druckt es sofort.

阿神
阿神

闭关修行中......

Antworte allen (4)
扔个三星炸死你
var a = []; for(var i = 0; i < 10; i++) { +function(i){ a[i] = function() { console.log(i); } }(i); }; a[6](); // 6

闭包问题

    巴扎黑

    可以利用 自定义属性
    var a = [];
    for (var i = 0; i < 10; i++) {

    var a[i].n = i;//自定义一个属性 n a[i] = function () { console.log(this.n); };

    }
    a[6](); // 6

      曾经蜡笔没有小新

      这个不关let什么事,我想提问者应该是想要输出6吧?

      但是你这提出来的问题,感觉和你想要的完全不搭边啊,我想帮你改提问描述也有点无能为力啊……

      这其实是闭包的问题,主要,我们先分析下为什么会输出10:

      var a = []; for(var i = 0; i < 10; i++) { a[i] = function () { console.log(i); }; } a[6](); // 10

      for里面的i的作用于是整个外部区域,所以,当调用a[6]()的时候,其实运行的是console.log(i),而此时因为跑完循环,i的值是10,所以输出10。

      至于提问者说的,let可以解决,是因为,for里面,let声明的变量,作用于只在for内部,所以,不会因为循环跑完而使得i在全局作用域中为10。

      其实,这个问题真正考察的应该是闭包。

      var a = []; for(var i = 0; i < 10; i++) { (function() { [i] = function () { console.log(i); } })(i); } a[6]();

      闭包的作用,类似于之前let的作用,是将局部的变量相互隔离开而不至于污染外部的变量值,每一个闭包内,都是一个独立的区域,而闭包传参只用于闭包内部使用,所以也可以实现输出6的结果。

        Peter_Zhu

        可以采用闭包的方式
        http://www.softwhy.com/articl...
        这个文章的后半部分已经解释了你的疑问

          Neueste Downloads
          Mehr>
          Web-Effekte
          Quellcode der Website
          Website-Materialien
          Frontend-Vorlage
          Über uns Haftungsausschluss Sitemap
          Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!