变量提升😀🌼

297 阅读2分钟

变量提升

在代码执行之前,会把JS中带有varfunction关键字的变量提前声明;对于带var 是只声明 不定义;function 是 声明 又定义; 给的默认值是undefinedfunction的 既声明 ;function 声明的函数 在整个代码执行之前; 早就已经存在了;所以在整个JS的任意位置都可以执行 在条件句中的代码,也会进行变量提升,不管条件是否成立,对于带function的变量 这时 只有声明 没有定义;(IE6-8 是既声明又定义的)

window

window 是个全局对象,通过 var 声明的变量,会向window中增加一个对应的属性 let const 声明的变量 不存在变量提升; 也就是说不能在 let 之前使用该变量;一使用就报错 let 和 const 声明的变量 不会再window中增加对应的属性

作用域

JS中的作用域: 全局作用域 私有作用域 JS作用域 就是指的 一块栈内存

栈内存 存贮值类型, 提供代码运行环境 堆内存 存储引用数据类型

全局作用域: 页面一打开 就会形成一个全局作用域;一个页面只有一个全局作用域 私有作用域: 函数执行的时候会形成一个私有的作用域;

全局变量: 在全局声明的变量叫做全局变量 私有变量: 在私有作用域声明的变量叫私有变量;形参也是私有变量

上级作用域 外层作用域;查找规律:上级作用域是谁,就看这个函数是在那个作用域声明定义的; 对于私有作用域中的某些变量,若没有在私有作用中声明过,那么函数执行时,就会去 上级作用域查找该变量,上级作用域若没有该变量,则接着向上级查找,直到查找到 全局作用域,若仍没有, 则报错; 作用域链:变量的查找机制,一直向上级作用域查找;

函数执行的过程

先开辟一个私有作用域(栈内存),形参赋值,然后变量提升,然后代码从上向下执行; 私有变量有 形参 和 在私有作用域中声明过的变量;其他的变量都是上级作用域的。 暂时性死区; 在let和const之前 不能使用 他们声明的任何变量

es6针对let和const声明的变量;多了一个块级作用域({ });理解成一个私有作用域即可