在函数内声明的变量只能从该函数内部访问(或者说是局部的)。如果示例代码改为以下形式,则更加清晰:
function f1() {
var x = "Inside f1";
}
console.log(x);
将会导致
。
ReferenceError: x is not defined
然而,如果一个变量在声明时没有使用var
关键字,则会成为一个隐式全局变量(这是不好的实践或者是一个错误):
function f2() {
y = "Inside f2";
}
console.log(y);
会按你期望的工作,同时也声明一个隐式全局变量。
值得一提的是"use strict";
,它可以在ES5's Strict Mode中运行代码。通常希望在函数内部声明此代码,这会导致函数在严格模式下运行,并且避免了严格模式的语义与其他代码相互影响。
function f3() {
"use strict";
z = "Inside f3";
}
console.log(z);
会产生
ReferenceError: z is not defined
由于严格模式不允许您声明隐式全局变量。
为了根据您的评论进行澄清,隐式全局变量会“覆盖”彼此。更明确地说,使用JavaScript术语:
x = 10
将在环境的全局对象x
上声明一个属性,对于浏览器环境,这是window.x
,对于Node / IO环境,这是global.x
。
x = 20
将重新定义上述相同的属性。
这是一个小片段,您可以在任何环境中运行它,以证明这一点。我绝不是在建议您使用隐式全局变量,而是提供另一个示例,说明为什么不应该使用它们。
function functionThatNeedsGreaterThan50(value) {
// Skip checking the parameter because we trust the
// other developers on the team to make sure they call
// this right.
}
function f4() {
q = 42;
}
function f5() {
q = 62;
}
f4();
f5();
console.log(q);
// sometime thousands of calls later, one of which was
f4();
// I thought this was 62 but
functionThatNeedsGreaterThan50(q);