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

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

虐人心 发布于 2017-03-03 字数 180 浏览 1101 回复 4

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

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

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

甜柠檬 2017-08-31 4 楼

纠正一下

 i = 0;

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

比如下面这个

 i = 1;

function fn () {
i = 0;
};

fn();

alert(i);

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

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

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

甜柠檬 2017-08-01 3 楼

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

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属性赋值的过程。

瑾兮 2017-05-23 2 楼

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>

晚风撩人 2017-05-08 1 楼

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

思考这个

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

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

所以 强烈建议 不要去掉var