IIFE 中的变量可在全局范围内访问
variables from IIFE accessible in global scope
这个IIFE的输出怎么是5?
(function() {
var a = b = 5;
})();
console.log(b);
我尝试了 console.log(a) 但它给出了预期的参考错误
为什么 'b' 在全球范围内还活着?
发生这种情况只是因为您将 b
声明为全局变量,而不是局部变量。
(function() {
var a = b = 5;
})();
由于 var
,它可能 看起来 像是在本地定义的,但这仅适用于 a
。
来自 documentation.
The scope of a variable declared with var is its current execution context and closures thereof, which is either the enclosing function and functions declared within it
有趣的问题。尽管它与 IIFE 或提升完全无关。请注意“a”是如何未定义的!
您的代码示例
function test() {
var a = b = 5;
}
在语义上等同于:
function test() {
var a = 5;
// this is essentially the same as `window.b = a`
b = a;
}
由于您没有声明“a”(又名 var a;
),它最终出现在全局范围内。
在严格模式下这是行不通的。
那是因为“泄漏”,这意味着无意中使局部声明的变量可用于全局范围。有关更多信息,请参见 here。让我们拆分您的代码:
var a = b = 5;
这意味着:a
取 b
的值,即 5。变量 b
在这种情况下被隐式声明和初始化(使用 b = 5
) ,并且由于您没有指定它的块范围(那是因为 var
指的是 a
,而不是 b
),它被限制在全局范围内。
这个IIFE的输出怎么是5?
(function() {
var a = b = 5;
})();
console.log(b);
我尝试了 console.log(a) 但它给出了预期的参考错误 为什么 'b' 在全球范围内还活着?
发生这种情况只是因为您将 b
声明为全局变量,而不是局部变量。
(function() {
var a = b = 5;
})();
由于 var
,它可能 看起来 像是在本地定义的,但这仅适用于 a
。
来自 documentation.
The scope of a variable declared with var is its current execution context and closures thereof, which is either the enclosing function and functions declared within it
有趣的问题。尽管它与 IIFE 或提升完全无关。请注意“a”是如何未定义的!
您的代码示例
function test() {
var a = b = 5;
}
在语义上等同于:
function test() {
var a = 5;
// this is essentially the same as `window.b = a`
b = a;
}
由于您没有声明“a”(又名 var a;
),它最终出现在全局范围内。
在严格模式下这是行不通的。
那是因为“泄漏”,这意味着无意中使局部声明的变量可用于全局范围。有关更多信息,请参见 here。让我们拆分您的代码:
var a = b = 5;
这意味着:a
取 b
的值,即 5。变量 b
在这种情况下被隐式声明和初始化(使用 b = 5
) ,并且由于您没有指定它的块范围(那是因为 var
指的是 a
,而不是 b
),它被限制在全局范围内。