函数作用域 if 语句

Function scope if statements

本文关键字:语句 if 作用域 函数      更新时间:2023-09-26

我正在尝试不寻常的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。

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

是的,IIFE 是模拟块范围的合理方法。

更好的方法是使用 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

let的 ES6 兼容性表