“var”是可选的吗?
myObj = 1;
与?相同?
var myObj = 1;
我发现他们都在我的测试中工作,我认为var
是可选的。是吗?
答案 0 :(得分:556)
他们意味着不同的东西。
如果使用var
,则变量在您所在的范围内声明(例如函数)。如果你不使用var
,变量会通过范围层向上冒泡,直到遇到给定名称或全局对象的变量(窗口,如果你在浏览器中这样做),然后它高度重视。然后它与全局变量非常相似。但是,它仍然可以使用delete
删除(很可能是其他人的代码也未能使用var
)。如果您在全局范围内使用var
,则变量真正全局,并且无法删除。
在我看来,这是javascript最危险的问题之一,应该弃用,或者至少提出警告警告。原因是,很容易忘记var
并且偶然发生了绑定到全局对象的公共变量名称。这会产生奇怪且难以调试的行为。
答案 1 :(得分:117)
这是Javascript的棘手部分之一,也是其核心功能之一。用var
“声明的变量”在你声明它的地方开始生效。如果你忽略了var
,就像你在谈论你以前用过的变量一样。
var foo = 'first time use';
foo = 'second time use';
关于范围,变量自动变为全局变量 不 为真。相反,Javascript将遍历范围链以查看您之前是否使用过该变量。如果它找到之前使用的同名变量的实例,它将使用它以及声明它的任何范围。如果它在任何地方都没有遇到变量,它最终将命中全局对象({{1}在浏览器中)并将变量附加到它。
window
当与嵌套函数和回调一起使用时,此行为非常强大。了解var foo = "I'm global";
var bar = "So am I";
function () {
var foo = "I'm local, the previous 'foo' didn't notice a thing";
var baz = "I'm local, too";
function () {
var foo = "I'm even more local, all three 'foos' have different values";
baz = "I just changed 'baz' one scope higher, but it's still not global";
bar = "I just changed the global 'bar' variable";
xyz = "I just created a new global variable";
}
}
是什么以及范围如何工作是Javascript中最重要的事情。
答案 2 :(得分:77)
不,他们不等同。
使用myObj = 1;
您正在使用全局变量。
后一个声明为您正在使用的范围创建一个本地变量。
尝试使用以下代码来了解差异:
external = 5;
function firsttry() {
var external = 6;
alert("first Try: " + external);
}
function secondtry() {
external = 7;
alert("second Try: " + external);
}
alert(external); // Prints 5
firsttry(); // Prints 6
alert(external); // Prints 5
secondtry(); // Prints 7
alert(external); // Prints 7
第二个函数改变全局变量“external”的值,但第一个函数不改变。
答案 3 :(得分:21)
除了本地与全球之外,还有更多内容。使用var
创建的全局变量与不使用的变量创建的全局变量不同。考虑一下:
var foo = 1; // declared properly
bar = 2; // implied global
window.baz = 3; // global via window object
根据目前为止的答案,这些全局变量foo
,bar
和baz
都是等效的。这是不的情况。使用var
创建的全局变量(正确)分配了内部[[DontDelete]]
属性,以便无法删除它们。
delete foo; // false
delete bar; // true
delete baz; // true
foo; // 1
bar; // ReferenceError
baz; // ReferenceError
这就是始终使用var
的原因,即使对于全局变量也是如此。
答案 4 :(得分:14)
var
是可选的。 var
将变量放在本地范围内。如果定义的变量没有var
,则它在全局范围且不可删除。
我认为不可删除的部分在特定环境的某个时间点是正确的。我一定是梦到了。
答案 5 :(得分:14)
围绕这个主题存在很多混乱,现有的答案都没有清楚直接地涵盖所有内容。以下是一些内联注释的示例。
//this is a declaration
var foo;
//this is an assignment
bar = 3;
//this is a declaration and an assignment
var dual = 5;
声明设置DontDelete标志。作业没有。
声明将该变量与当前范围联系起来。
已分配但未声明的变量将查找要将其自身附加到的范围。这意味着它将遍历范围的食物链,直到找到具有相同名称的变量。如果没有找到,它将被附加到顶级范围(通常称为全局)。
function example(){
//is a member of the scope defined by the function example
var foo;
//this function is also part of the scope of the function example
var bar = function(){
foo = 12; // traverses scope and assigns example.foo to 12
}
}
function something_different(){
foo = 15; // traverses scope and assigns global.foo to 15
}
为了清楚地描述正在发生的事情,这个analysis of the delete function涵盖了变量实例化和广泛分配。
答案 6 :(得分:8)
未声明的变量(不含var
)被视为全局对象的属性。 (通常是window
对象,除非您在with
块中)
使用var
声明的变量是普通的局部变量,并且在它们声明的函数之外是不可见的。(注意Javascript没有块范围)
答案 7 :(得分:8)
查看这个小提琴:http://jsfiddle.net/GWr6Z/2/
function doMe(){
a = "123"; // will be global
var b = "321"; // local to doMe
alert("a:"+a+" -- b:"+b);
b = "something else"; // still local (not global)
alert("a:"+a+" -- b:"+b);
};
doMe()
alert("a:"+a+" -- b:"+b); // `b` will not be defined, check console.log
答案 8 :(得分:6)
Javascript中的var关键字是出于某种目的。
如果声明一个没有var关键字的变量,如下所示:
myVar = 100;
它成为可以从脚本的任何部分访问的全局变量。如果您没有故意这样做或者没有意识到这一点,那么如果您在javascript中的其他位置重复使用变量名称,则可能会让您感到痛苦。
如果使用var关键字声明变量,请执行以下操作:
var myVar = 100;
它是范围({] - 大括号,函数,文件的本地,取决于您放置它的位置。)
这是一种更安全的方法来处理变量。因此,除非您是故意这样做,否则尝试使用var关键字声明变量,而不是没有。
答案 9 :(得分:4)
今天在StackOverflow上提出这个问题:
一个好的测试和一个实际例子就是在上面的场景中发生的...... 开发人员在他的一个变量中使用了JavaScript函数的名称。
代码有什么问题?
该代码仅在用户第一次单击按钮时才起作用。
解决方案是什么?
在变量名称前添加var
关键字。
答案 10 :(得分:4)
Var 不允许程序员声明变量,因为Javascript没有变量。 Javascript有对象。 Var 显式声明未定义对象的名称。赋值将名称指定为已赋予值的对象的句柄。
使用 var 告诉Javacript解释器两件事:
var 的省略告诉Javacript解释器使用第一个找到的具有相同名称的对象的先前实例。
Var作为一个关键词源于语言设计师的糟糕决定,就像Javascript作为一个名字来自一个糟糕的决定。
PS。研究上面的代码示例。
答案 11 :(得分:0)
关于范围的一切,它们可以以不同的方式使用。
console.out(var myObj=1);
//SyntaxError: Unexpected token var
console.out(myObj=1);
//1
某事陈述与表达
答案 12 :(得分:0)
不,它不是“必需的”,但如果不这样做,它可能会导致重大问题。没有使用var定义变量将该变量放在它所在的代码部分的范围内。如果不这样,那么它不包含在该范围内,并且可以覆盖以前定义的变量,这些变量具有在范围之外的相同名称您所在的职能。
答案 13 :(得分:-3)
我刚刚从我的一位同事推荐的论坛中找到答案。如果在函数外声明变量,它总是全局的。无论你是否使用var关键字。但是,如果在函数内声明变量,它会有很大的不同。在函数内部,如果使用var关键字声明变量,它将是本地的,但如果您声明没有var关键字的变量,它将是全局的。它可以覆盖以前声明的变量。 - 请参阅:http://forum.webdeveloperszone.com/question/what-is-the-difference-between-using-var-keyword-or-not-using-var-during-variable-declaration/#sthash.xNnLrwc3.dpuf