我正在尝试不寻常的Javascript“模式”,并且如果不希望在父作用域中声明变量,我想到了一种潜在的简洁的作用域 block 方法。
例如,而不是:
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是模仿 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
关于javascript - if 语句的函数作用域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28240429/