使用var和不使用var,在JS中有什么差异?

在JS中,我们定义变量一般都有以下两种方式。
第一种:

  
var a = 1;
var foo = function() {}
var obj = {}
var obj.id = 3;

第二种:

  
a = 1;
foo = function() {}
obj = {}
obj.id = 3;

以上两种方式有什么差别?它们都在什么场合使用呢?

评论 (0)链接2011-11-10 

首先我们要去了解什么是变量定义,什么是变量赋值,下面的语句是变量定义:

  
var i;

变量的定义决定了变量的作用域,这个是该问题的关键。
而下面的语句是赋值:

  
i = 2;

了解了这点我们去了解变量的作用域链,从网上找来的定义:JavaScript需要查询一个变量x时,首先会查找作用域链的第一个对象,如果以第一个对象没有定义x变量,JavaScript会继续查找有没有定义x变量,如果第二个对象没有定义则会继续查找,以此类推。
我们知道Javascript的最小作用域单元是函数体,假设我们有两个嵌套的函数定义,最里面的函数在查找变量时会先查找自己内部的变量定义,如果没有会到外层的函数定义里查找,如果还没有就会到全局里查找。结合作用域链和变量定义、赋值的基础知识,我们就知道,当我们再最里层的函数给一个变量赋值(即执行 i = 2的操作)时,它首先会依照作用域链的顺序去找该变量的定义,如果最后都没有找到定义语句(即 var i语句),就会有两种结果出现——报错或解析器帮你在作用域链的最后一个节点定义该变量,因为各个浏览器的JS解析实现不同,所以这两种情况都可能出现。
最后,我们回到你的问题,var a = 1和a = 1有何不同,答案是一个自己定义变量赋值,一个是没有定义变量直接赋值,而变量的定义交给JS的解析器处理了。
另外说一点,"var obj.id = 3;" 这个语句是不对的,obj.id = 3是一个给obj对象的id属性赋值的过程,对象的属性无需定义,因为没有作用域的问题。于是关于没有var的赋值语句也可以用另外一种的方式解释:JS所有的全局函数和变量都是window对象的属性或方法,所以当它找不到被赋值的变量的定义的时候,就会执行一次window属性赋值的过程。

潘占东
编辑于 2011-11-12
该答案已被锁定,无法对其进行评论,编辑及投票。
()
评论 (0)链接 • 2011-11-12

function 中设置,var 局部, 没var 全局

demo1 i 是局部变量

  
<script>
function a()
{
var i=5;
alert(i);
}
a();
alert(i);
</script>

demo2 i 是全局变量

  
<script>
function a()
{
i=5;
alert(i);
}
a();
alert(i);
</script>
该答案已被锁定,无法对其进行评论,编辑及投票。
()
评论 (0)链接 • 2011-11-10

var i=0; //在预编译的时候 告诉js 我已经定义了一个值为0的名为i的变量啊
i=0; //在预编译的时候 告诉js 我想创建一个值为0的名字为i的全局变量

思考这个

  
//1
alert(i);
i="rambo";

//2
alert(i);
var i="ramob";

所以 强烈建议 不要去掉var

该答案已被锁定,无法对其进行评论,编辑及投票。
()
评论 (0)链接 • 2013-05-03

纠正一下

  
i = 0;

上面并不是说,创建一个全局变量 i 并将它初始化为零。

比如下面这个

  
i = 1;

function fn () {
i = 0;
};

fn();

alert(i);

运行上面的例子,会看到 alert 的结果是 0

其实 javascript 心法口诀很简单,就是在你想要定义并初始化一个变量的时候,显式的使用关键字 var。

因为虽然 javascript 有局部变量的概念,但是如果不显式的使用 var 的话,解释器会向上寻找,直到在 window 这个全局 scope 下面都找不到这个变量的定义,就会抛出 undefined 异常

该答案已被锁定,无法对其进行评论,编辑及投票。
()
评论 (0)链接 • 2013-05-03

不是您所需,查看更多相关问题与答案

德问是一个专业的编程问答社区,请 登录注册 后再提交答案