Page 91 - 你不知道的JavaScript(下卷)
P. 91

考虑:

                   var funcs = [];

                   for (let i = 0; i < 5; i++) {
                       funcs.push( function(){
                           console.log( i );
                       } );
                   }

                   funcs[3]();    // 3

               for 循环头部的 let i 不只为 for 循环本身声明了一个 i,而是为循环的每一次迭代都重新
               声明了一个新的 i。这意味着 loop 迭代内部创建的闭包封闭的是每次迭代中的变量,就像
               期望的那样。

               如果试验同样的代码,只把 var i 放在 for 循环头部,得到的结果就会是 5 而不是 3,因
               为在外层作用域中只有一个 i,这个 i 被封闭进去,而不是每个迭代的函数会封闭一个
               新的 i。

               还可以通过下面更详细一点的代码完成同样的事情:

                   var funcs = [];

                   for (var i = 0; i < 5; i++) {
                       let j = i;
                       funcs.push( function(){
                           console.log( j );
                       } );
                   }

                   funcs[3]();    // 3

               这里我们强制在每个迭代内部创建了一个新的 j,然后闭包的工作方式是一样的。我更喜
               欢前面一种形式;这个特殊的额外功能是我为什么支持 for (let .. ) .. 形式的原因。可
               能有人认为这种形式太隐式(隐晦),但我认为这已经足够明晰,也足够有用了。

               let 放在 for .. in 和 for .. of 循环中也是一样的(参见 2.9 节)。

               2.1.2 const 声明

               还有一个块作用域声明形式需要了解:const,用于创建常量。

               常量到底是什么?它是一个设定了初始值之后就只读的变量。考虑:

                   {
                       const a = 2;
                       console.log( a );      // 2



               68   |   第 2 章
                                图灵社区会员 avilang(1985945885@qq.com) 专享 尊重版权
   86   87   88   89   90   91   92   93   94   95   96