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

匿名 (未验证) 提交于 2019-12-03 00:17:01

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);

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

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

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

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

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

var:只声明未定义

funtion:声明和赋值都完成了

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

在全局作用域下声明(var)的函数或者变量是“全局变量”,同理,在私有作用域下声明(var)的变量是“私有变量var/function的才是声明,例如在私有作用域(函数)
1 a = 13; 2 console.log(window.a);//=>13

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

等价于

等价于

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

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




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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!