3

我了解 var 关键字在函数内部的含义,但现在我试图了解 var 关键字在函数外部的目的是什么。我做了一些测试(见下文),没有任何区别。那么,如果将 var 关键字放在函数之外,什么时候会有什么不同呢?

1.

example = 1;
function test(){  
  var example = 2;
}
test();
alert(example); //alert 1 no matter if example=1 or var example=1 before function

2.

example = 1;
function test(){  
  example = 2;
}
test();
alert(example); //alert 2  no matter if example=1 or var example=1 before function

3.

var example = 1;
function test(){   
  alert(example);   
}
test(); //always alert 1, no matter if var example=1 or example=1 before function
4

7 回答 7

1

关键字var在当前范围内声明一个变量(好吧,技术上在同一个闭包中,但现在让它保持简单)

由于您的函数(测试)和变量(示例)都在“全局”范围内声明,因此它们都可以相互访问,这意味着函数test可以访问变量example

在您的第一个示例中,您声明了一个名为 example 的新 var,这意味着现在当您调用 var 示例(在方法内部)时,它将改为引用此变量。

于 2012-08-08T17:10:08.593 回答
1

它们是有区别的!

请参阅此答案https://stackoverflow.com/a/1471738/211070,但基本上:

由于变量声明创建带有 DontDelete 标志的属性,因此 var x = 1 和 x = 1 (在全局范围内执行时)之间的区别在于前者 - 变量声明 - 创建了 DontDelete'able 属性,而后者没有。因此,通过这种隐式赋值创建的属性可以从全局对象中删除,而前一个 - 通过变量声明创建的属性 - 不能。

于 2012-08-08T17:12:54.463 回答
0

1)此警报的原因1是因为即使您test()事先调用了该函数,它本身也在调用并创建自己的闭包并在其中声明一个单独var example = 2;的内部。(所以你的警报看不到它,它只看到1)。现在,如果您这样做了:return example = 2;您会注意到 alert(example) === 2。这是因为您将示例从闭包中取出,并且它影响了前面的示例变量。

example = 1;
function test(){  
    var example = 2;
}
test();
alert(example);

2)在这里,您没有在函数内部创建新变量,因此它能够(通过闭包)访问它外部的变量示例,并将其更改为 2。

example = 1;
function test(){  
  example = 2;
}
test();
alert(example); //alert 2  no matter if example=1 or var example=1 before function

3)最后一个是“关闭”如何在这里工作的一个很好的例子。变量,不像我们说function ()必须在试图访问它们的东西之上声明。另一方面,函数没有。所以虽然var example = 1可能低于function test() { }自身,但没关系。重要的是它在CALL to之前声明test()。这是创建闭包的时候,它将自己包裹在它可以看到/访问的任何变量等周围。

// so this ...
var example = 1;
function test(){   
    alert(example);   
}

// and this work ...
function test(){   
    alert(example);   
}
var example = 1; // <-- notice it's still above the test() func call, it can still see example
test(); //always alert 1, no matter if var example=1 or example=1 before function
// if var example = 1; was down here below it, it would alert "undefined", this is because
// the variable was not available within the scope when test() was called.
于 2012-08-08T17:18:08.683 回答
0

只要您不在严格模式下,全局空间就没有真正的区别。

也就是说,您仍然应该使用var良好的编程习惯。自动定义的变量是邪恶的。

于 2012-08-08T17:10:53.383 回答
0

我相信如果你将一个 var 放在一个函数中,它只能像 PHP IF 语句一样单独在该函数中使用,如果你把一个 var 放在函数之外,那么它可以在多个函数中使用 - 就像其中的一个变量页面范围。

于 2012-08-08T17:11:13.587 回答
0

-Keywordvar在函数内使用时与在函数外使用时完全相同:它将一个新变量绑定到当前范围。在函数的情况下,范围就是函数。在函数之外使用全局范围。在浏览器中,该全局范围通常是window-Object。

lg,

弗洛

于 2012-08-08T17:12:05.910 回答
0

var关键字在当前范围内声明一个变量。如果没有它,您将自动在window对象上声明一个新属性,或者在更高范围内访问和修改同名变量(如果存在)。在您的示例中,只有全局范围和内部函数范围,因此var example = 1在全局范围内,出于您的目的,在技术上与 just 相同example = 1。但是,如果您上面的所有代码都在其他函数范围内执行,则前两个示例将声明一个全局example属性,而第三个示例将声明一个该范围的本地变量。

于 2012-08-08T17:13:03.303 回答