-
定义
变量的定义有两种,用var和不用varvar useVar = 1 notVar = 1
这两种定义方式主要区别在于作用域和有无变量提升。
-
作用域
javascrpt没有块级作用域,只有函数作用域和全局作用域。
使用var进行变量的定义,作用域由定义语句的位置决定:
在函数中定义,作用域是该函数作用域;
在函数外定义,作用域是全局作用域;
不使用var进行变量的定义,作用域是全局作用域。- 函数作用域
在函数中定义的变量都在一个作用域中。比如:
function effectScope(){ var funcVar = 1; var i = 0; for(i = 0; i < 5; i++){ var funcVar = i; } console.log(funcVar); } effectScope(); // 输出4,而不是1
上面代码中for循环中的var funcVar实际上覆盖了外层的funcVar
- 全局作用域
全局作用域中定义的变量在整个程序中都可以访问。不过全局作用域容易造成命名冲突,应该尽量避免使用。
- 函数作用域
-
变量提升
使用var定义的变量会存在变量提升的行为。变量提升就是将变量提升到所在作用域的最前面进行定义。比如:a = 5; var a = 10; console.log(a); // 5
上面代码结果输出5,是因为var a = 10进行了变量提升,将这条语句提升到了a=5的前面。造成的结果是a先被定义成10,后面被赋值成5。
所以,为了避免错误,建议把函数定义语句统一写到作用域最前面
比如:function count(){ for(var i = 0; i < 5; i++){ console.log(i); } }
建议改成:
function count(){ var i = 0; for(i = 0; i < 5; i++){ console.log(i); } }
网友评论