-js变量提升机制:
当作用域形成之后,js代码执行之前,浏览器会对待var和function关键字的进行提前声明或者定义,
这种预先处理的机制叫做变量提升(预解释)
- 私有作用域的变量提升 a
1,变量提升发生在当前作用域下
2,当全局作用域形成的时候,不对私有作用域中的变量进行变量提升
3,私有作用域中的var和function会在私有作用域执行的时候进行声明或定义
浏览器很懒,对做过的事情,不会再做
var fn=0;
function fn(){
var a=1;
console.log(a);
}
fn();
- 带var和不带var的区别 b
1,全局var声明一个变量,和window对象有互相映射关系,定义之前使用,值为undefined
console.log(fn);//undefined
var fn=10;//10
window.fn=12;//12
2,不带var,是给全局window添加了一个属性( "use strict"严格模式除外),添加之前直接使用属性,报错
console.log(a);//报错
a=12;
var a=12;
function fn(){
a=12;
}
fn();
console.log(window.a);//12
- 只对等号左边的进行变量提升 c
1,等号左边是匿名函数或自执行函数不进行变量提升
- 变量提升不重复 d
1,不管是var 还是function声明,如果重复命名了,都只声明一次
2,后面的值会覆盖前面的
- if判断下的变量提升 e
1, 在老版本浏览器中,if判断下的var只声明不定义,function声明加定义,
为了迎合es6中的块级作用域,在新版本浏览器中,if判断下的var和function都只声明不定义