我理解函数内部的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
阿拉伯数字。
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
关键字 var
在当前范围内声明一个变量(好吧,从技术上讲,在相同的闭包中,但现在让我们保持简单)
由于您的函数(测试)和变量(示例)都是在"全局"范围内声明的,因此它们都可以相互访问,这意味着函数test
可以访问变量example
在您的第一个示例中,您已经声明了一个名为 example 的新 var,这意味着现在当您调用 var 示例(在方法内部)时,它将引用此变量。
有区别!
https://stackoverflow.com/a/1471738/211070 看到这个答案,但基本上:
由于变量声明使用 DontDelete 标志创建属性,因此 var x = 1 和 x = 1 之间的差异(在全局范围内执行时) 是前一个 - 变量声明 - 创建 DontDelete'able 属性,而后者没有。结果,创建了属性 通过这个隐式赋值,然后可以从全局中删除 对象,前一个 - 通过变量声明创建的那个 - 不可能。
只要您不处于严格模式,全局空间就没有真正的区别。
也就是说,您仍应将var
用作良好的编程实践。自动定义的变量是邪恶的。
如果你在一个函数中放置一个变量,它只能像 PHP IF 语句一样单独在该函数中使用,就像你把一个变量与函数一起放出来一样,那么它可以在多个函数中使用 - 就像页面范围内的变量一样。
var
-Keyword 在函数内使用时与在函数外部使用时完全相同:它将新变量绑定到当前范围。在函数的情况下,作用域是函数。在函数之外使用全局作用域。在浏览器中,该全局作用域通常是 window
-Object。
LG,
弗洛
var
关键字声明当前作用域中的变量。如果没有它,您将在 window
对象上自动声明一个新属性,或者在更高范围内访问和修改同名变量(如果存在)。在您的示例中,只有全局作用域和内部函数作用域,因此就您的目的而言,全局作用域中的var example = 1
在技术上与仅example = 1
相同。但是,如果上述所有代码都是在其他函数作用域内执行的,则前 2 个示例将声明全局 example
属性,而第三个示例将声明该作用域的本地变量。
> 1)这提醒1
的原因是,即使您事先调用了test()
函数,它本身也会调用并创建自己的闭包,并在其中声明一个单独的var example = 2;
。(因此,您的警报看不到它,它只能看到 1)。 现在,如果您这样做了:return example = 2;
您会注意到警报(示例)=== 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.