如何在ECMAScript 5中使用块范围

时间:2015-07-06 07:52:59

标签: javascript angularjs ecmascript-6 ecmascript-5

当我阅读有关ES 6功能的内容时,我发现let用于创建块范围。这个link对ES6功能和let语句有很好的解释。那么开发人员如何在旧版ECMAScript中创建此block scopes,如ES5。

以下代码段解释了let

var es = [];
for (var i = 0; i < 10; i++) {
  let c = i;
  es[i] = function () {
    console.log("Upcoming edition of ECMAScript is ES" + c);
  };
}
es[6](); // Upcoming edition of ECMAScript is ES6

ES5中的等效代码是什么?

上面没有let的代码段,10输出i,因为它在全球范围内。

var es = [];
for (var i = 0; i < 10; i++) {
  es[i] = function () {
    console.log("Upcoming edition of ECMAScript is ES" + i);
  };
}
es[6](); // Upcoming edition of ECMAScript is ES10

link在ES5中具有ES6等效项,并建议将IIFE用于块作用域。但我不确定如何在当前情况下使用IIFE。

非常感谢任何帮助。

提前致谢。

2 个答案:

答案 0 :(得分:4)

  

它建议将IIFE用于块范围。

在ES5中,只调用一个函数会创建一个新范围。所以“很明显”,如果你想创建一个新的范围(每次迭代),你必须调用一个函数。这就是IIFE的作用:它创建一个新功能并立即调用它。

任何块作用域的变量(例如通过let)都将成为函数的参数,初始值将作为参数传递。

示例:

for (var i = 0; i < 10; i++) {
  (function(c) {
    es[i] = function () {
      console.log("Upcoming edition of ECMAScript is ES" + c);
    };
  }(i));
}

当然这是简化的,可能会出现需要更复杂解决方案的情况。

答案 1 :(得分:2)

目前的最佳做法是编写ES2015(ES6)并通过Babel之类的预处理器运行代码。 Babel了解了在旧浏览器上支持let的实现细节。

如果您想直接使用ES5,可以create an anonymous function在每次迭代中传递i的值。

var es = [];
for (var i = 0; i < 10; i++) {
  (function (i) {
    es[i] = function () {
      console.log("Upcoming edition of ECMAScript is ES" + i);
    };
  })(i);
}
es[6]();