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:声明和赋值都完成了
变量提升只发生在当前作用域,开始加载页面的时候全局作用域是当前作用域,所以只会对全局作用域下的进行提升,因为变量提升是发生在当前作用域,因为此时函数是私有作用域,没有任何提升行为,函数中的代码只是存储的字符串而已
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