Javascript 为什么这个函数中的变量是全局的?
我认为函数中定义的任何变量都是局部变量,但我可以轻松访问函数外部的变量“e”Javascript 为什么这个函数中的变量是全局的?,javascript,scope,Javascript,Scope,我认为函数中定义的任何变量都是局部变量,但我可以轻松访问函数外部的变量“e” function change() { var d = 6; e = 7; } change(); alert(e); //> alerts 7 因为默认情况下,新变量将进入全局范围var通过将变量的存在限制在当前范围内来防止这种情况发生。因为它是在没有var的情况下声明的,所以它会成为全局窗口对象的一部分。您没有明确声明它本身,所以它采用了全局范围。这是因为默认情况下,e是全局的,使用var使范围变
function change() {
var d = 6;
e = 7;
}
change();
alert(e); //> alerts 7
因为默认情况下,新变量将进入全局范围
var
通过将变量的存在限制在当前范围内来防止这种情况发生。因为它是在没有var
的情况下声明的,所以它会成为全局窗口
对象的一部分。您没有明确声明它本身,所以它采用了全局范围。这是因为默认情况下,e是全局的,使用var使范围变为变量。
你可以在中阅读更多关于这方面的内容,我猜你是在这样的假设下进行的 JSLint期望var 只声明一次,而且它将 必须在使用前声明 代码的问题是您使用的是一个var,但第二行前面没有var。这将变量e推到了全局名称空间中 为什么会这样?在变量声明中使用了分号而不是逗号
function change() {
var d = 6, //Change this to a comma
e = 7;
}
change();
alert(e); //will produce an error now
创建全局变量非常容易,下面是一些我见过的其他问题
// :-( antipattern: implied global variable
function sum(x, y) {
result = x + y; // result is global
return result;
}
// :-) better
function sum(x, y) {
var result = x + y; // result is local
return result;
}
// :-( antipattern: chain assignments as part of a var declaration
function foo() {
var a = b = 0; // b is global
}
// :-) better
function foo() {
var a, b;
a = b = 0; // both local
}
除非您处于严格模式,当您遇到未声明的变量时抛出ReferenceError。@user701092那么您是被错误的人教的,或者您被误解了。(可能有人告诉你每个变量每个作用域只能使用
var
一次。)@user这个建议,AFAIK,来自Douglas Crockford和他的同事。要将var
应用于多个声明,请使用逗号分隔它们:var d=6,e=7代码>JSLint暗示了很多荒谬的事情。我建议忽略这些建议。@Pointy这是否意味着我必须用“var”定义每个变量,而不是不使用??您是否打算在var d=6
后加逗号?我之所以问这个问题,是因为e
上有额外的缩进,这是在单个var语句中定义多个变量(多行)时的典型情况。如果用逗号替换分号,e
将是一个局部变量。