变量提升

变量提升:
=>当栈内存(作用域)形成,JS代码自上而下执行之前,浏览器首先会把所有带’VAR’/'FUNCTION’关键词的进行提前”声明”或者“定义”,这种预先处理机制称之为变量提升
=>声明(declare):var a (默认值undefined)
=>定义(defined):a=12(定义其实就是赋值操作)
【变量提升阶段】
=>带“VAR"的只声明未定义
=>带“FUNCTION”的声明和赋值都完成了
=>变量提升只发生在当前作用域(例如:开始加载页面的时候只会对全局作用域下的进行提升,因为此时函数中存储的都是字符串而已)
=>在全局作用域下声明的函数或者变量是“全局变量“,同理,在私有作用域下声明的变量是”私有变量“【带VAR/FUNCTION的才是声明】
=>浏览器很懒,做过的事情不会重复执行第二遍,也就是当代码执行遇到创建函数这部分代码之后,直接的跳过即可(因为在提升阶段就已经完成函数的赋值操作了)
私有作用域形成后,也不是立即代码执行,而是先进行变量提升(变量提升前,先形参赋值)
在ES3/ES5语法规范中,只有全局作用域和函数执行的私有作用域(栈内存),其他大括号不会形成栈内存
// =>在全局作用域下声明一个变量,也相当于给WINDOW全局对象设置了一个属性,变量的值就是属性值(私有作用域中声明的私有变量和WINDOW没啥关系)
console.log(a); //=>undefined
console.log(window.a); //=>undefined
console.log(‘a’ in window); //=>TRUE 在变量提升阶段,在全局作用域中声明了了一个变量A,此时就已经把A当作属性赋值给WINDOW了,只不过此时还没有给A赋值,默认值undefined
【变量提升】var a = 12;
console.log(a); //=>全局变量A 12
console.log(window.a) ; //=>WINDOW的一个属性名A 12

    推荐阅读