隐式全局变量,var a=1,b=1;与var a=b=1;的区别

var a=1,b=1;与var a=b=1;在工作中第一种写法比较常见,但是我们偶尔也图方便用到第二种写法,以前以为他们表达的语义是一样的,实际操作中发现不太一样,上例子说明:

1 console.log(a, b);
2 var a = 1, b = 1;
3 function fn() {
4     console.log(a, b);
5     var a = b = 2;
6     console.log(a, b);
7 }
8 fn();
9 console.log(a, b);

看到上面一段代码,有一点开发经验的可能会脱口而出,从上至下:

undefined  undefined

undefined  undefined

2  2

1  1

很明显,既然这样问了,这个答案就不准确

变量提升:当栈内存(作用域)形成,JS代码自上而下执行之前,浏览器首先会把所有带 var/function关键词的进行提前 声明 或者 定义 ,这种预先处理机制称之为 变量提升

声明:var a (此时a=undefined)

定义:a=2(没有声明,所以放在哪里都是全局变量)

var:只声明未定义

funtion:声明和赋值都完成了

变量提升只发生在当前作用域,开始加载页面的时候全局作用域是当前作用域,所以只会对全局作用域下的进行提升,因为变量提升是发生在当前作用域,因为此时函数是私有作用域,没有任何提升行为,函数中的代码只是存储的字符串而已

在全局作用域下声明(var)的函数或者变量是全局变量,同理,在私有作用域下声明(var)的变量是私有变量 , 带var/function的才是声明,例如在私有作用域(函数)中,如果不带var,就是未声明,就会往上级作用域链查找,如果全局有,就是全局变量了,如果window没有这个属性(变量),就会给window设置一个属性window.a = 2;
1 a = 2;
2 console.log(window.a);//=>2

此时a是全局变量,所以a === window.a,不加var意味在全局定义一个属性,也就是引出了要讨论的隐式全局变量

var a=1,b=1;  等价于  var a=1;var b=1;

var a=b=1;  等价于  var a=1;b=1;

此时我们大概理解了上面两句赋值语句的不同,var a=b=1;这句,b没有var,那它就是全局变量

由此,最上面的代码的答案我们应该可以知晓:

undefined  undefined
undefined  1
2  2
1  2

参考地址:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Statements/var

posted @ 2019-11-06 17:36  lhjfly  阅读(829)  评论(1编辑  收藏  举报