我正在尝试使用不寻常的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。
我的问题是,鉴于上述条件(不在循环中使用),这种模式是否仍然有用,为什么上下文的创建如此昂贵?
答案 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