函数范围if语句

时间:2015-01-30 16:34:34

标签: javascript scope execution-time anti-patterns

我正在尝试使用不寻常的Javascript“模式”,并且如果在父作用域中声明变量是不合需要的,则会想到一种可能很好的方法。

例如,而不是:

function someFunction () {
  var x, t;

  for (x = 0; x < 10000; x += 1) {
    if (true) {
      t = x;
    }
  }
}

可以使用以下方法保存额外的父变量:

function someFunction () {
    var x;

    for (x = 0; x < 10000; x += 1) {
      if (true) { void function () {
        var t = x;
      }(); }
    }
}

然而,我的jsperf(http://jsperf.com/scoped-if)表明,重复使用时,这可能会对性能产生负面影响。显然,除非谨慎执行,否则这一结果表明上述内容并非实用模式。

我理解缓慢可能是执行上下文(1 + 10000)的重复创建和破坏,而第一个只涉及1。

我的问题是,鉴于上述条件(不在循环中使用),这种模式是否仍然有用,为什么上下文的创建如此昂贵?

1 个答案:

答案 0 :(得分:2)

是的,IIFE是模仿block scope的合理方式。

更好的方法是使用let,必要时使用ES6转换器:

function someFunction () {
    var x;

    for (x = 0; x < 10000; x += 1) { 
      if (true) { 
        let t = x;
        // Do something with t here
      }
      // because it is not defined here
    }
    // or here
}
// and even a var wouldn't be defined here

ES6 compatibility table for let