JS的变量作用域浅谈

 作为前端小白,总是对JS的作用域有点迷糊,这里稍微研究了一下分享出来,希望和我一样的小白可以学的一点

 

首先是一个经典的例子:

var a=0,b=0;
for (var i = 0; i < 10; i++) {
	a = 2
	if (true) {
	b = 3;
}}
console.log(a,b);     //2 3 

 这里肯定输出2,3    但是我们加上var后结果依然会这样:

var a=0,b=0;
for (var i = 0; i < 10; i++) {
    var a = 2
    if (true) {
    var b = 3;
}}
console.log(a,b,i);    //输出 2 3 10

  这里就很尴尬了,很多初学者都会犯这种毛病,以为在里面加上var就是局部变量,其实在 for 和 if 中可以不用var关键字,因为ECMAScript不存在块级作用域,因此循环内部的变量可以在外边访问到。

  值得一提的是ES6添加了let这一特性,使得它定义的变量被限定在了特定范围内才能使用,而离开这个范围则无效。

  如下:

1 var a=0,b=0,i=0;
2 for (let i = 0; i < 10; i++) {
3     let a = 2
4     if (true) {
5     let b = 3;
6 }}
7 console.log(a,b,i);    //0 0 0

 

  现在我们再来看函数以及参数的作用域: 

 1 var a=0,b=1;
 2 function x(a,b){
 3         arguments[0]=100;
 4         window.b=222;
 5         b=333;
 6         c=99;
 7         console.log(a,b,c);    //100 333 99
 8 }
 9 x(a,b);
10 console.log(a,b,c);        //0 222 99

 

  ECMAScript中所有参数都是按值传递的,也就是说把函数外部的值赋给内部的参数,而且参数只能按值传递,你可以把函数的参数想象成局部变量。

 

  我们将a,b两个变量传递给函数的参数,然后在第3行改变第一个参数的值,在第4行使用window改变全局变量b的值,显然函数内部参数的改变无法影响到全局变量。

但是在第6行我们赋值时没有使用关键字var,于是函数调用完后,这个变量c 被添加到了全局环境下。 

  在编写JS代码中,不声明直接初始化变量很不好,这样有可能导致意外,所以建议在初始化前一定要先声明。

 

posted @ 2017-04-05 15:09  博地凡夫  阅读(228)  评论(0编辑  收藏  举报