Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么这个函数中的变量是全局的?_Javascript_Scope - Fatal编程技术网

Javascript 为什么这个函数中的变量是全局的?

Javascript 为什么这个函数中的变量是全局的?,javascript,scope,Javascript,Scope,我认为函数中定义的任何变量都是局部变量,但我可以轻松访问函数外部的变量“e” function change() { var d = 6; e = 7; } change(); alert(e); //> alerts 7 因为默认情况下,新变量将进入全局范围var通过将变量的存在限制在当前范围内来防止这种情况发生。因为它是在没有var的情况下声明的,所以它会成为全局窗口对象的一部分。您没有明确声明它本身,所以它采用了全局范围。这是因为默认情况下,e是全局的,使用var使范围变

我认为函数中定义的任何变量都是局部变量,但我可以轻松访问函数外部的变量“e”

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=7JSLint暗示了很多荒谬的事情。我建议忽略这些建议。@Pointy这是否意味着我必须用“var”定义每个变量,而不是不使用??您是否打算在
var d=6
后加逗号?我之所以问这个问题,是因为
e
上有额外的缩进,这是在单个var语句中定义多个变量(多行)时的典型情况。如果用逗号替换分号,
e
将是一个局部变量。