使用'var'来声明变量是可选的吗?

时间:2010-03-21 01:06:52

标签: javascript

“var”是可选的吗?

myObj = 1;

与?相同?

var myObj = 1;

我发现他们都在我的测试中工作,我认为var是可选的。是吗?

14 个答案:

答案 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

根据目前为止的答案,这些全局变量foobarbaz都是等效的。这是的情况。使用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)

They are not the same.

未声明的变量(不含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上提出这个问题:

Simple Javascript question

一个好的测试和一个实际例子就是在上面的场景中发生的...... 开发人员在他的一个变量中使用了JavaScript函数的名称。

代码有什么问题?
该代码仅在用户第一次单击按钮时才起作用。

解决方案是什么?
在变量名称前添加var关键字。

答案 10 :(得分:4)

Var 不允许程序员声明变量,因为Javascript没有变量。 Javascript有对象。 Var 显式声明未定义对象的名称。赋值将名称指定为已赋予值的对象的句柄。

使用 var 告诉Javacript解释器两件事:

  1. 不使用 委派反向遍历查找名称的值,而不是使用此
  2. 不删除名称
  3. 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