变量提升:
=>当栈内存(作用域)形成,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
推荐阅读
- JavaScript|JavaScript: BOM对象 和 DOM 对象的增删改查
- 前端|web前端dya07--ES6高级语法的转化&render&vue与webpack&export
- JS/JavaScript|JS/JavaScript CRC8多项式 16进制
- JS|VUE学习笔记[30-46]
- 腾讯TEG实习|腾讯实习——Vue解决跨域请求
- 地图|高德地图清除指定覆盖物 自定义覆盖物样式(完整dome)
- Pyecharts|Pyecharts 猎聘招聘数据可视化
- flex|C语言-使用goto语句从循环中跳出
- HTML+Js实战项目|在网页中实现icon小图标的几种方法
- js中国标准时间转化为年月日,时间戳