变量与函数的提升
背景
浏览器中的js解析器对js的解析机制是js代码在运行的时候,会经历两个阶段:解释代码和执行代码
1、预解析
- 先找var声明的变量和function声明的函数,将var声明的变量和function声明的函数提升到所属作用域的最顶端
- var声明的变量,只是提升变量声明,并不将赋值初始化提升
- 其实
函数提升是优先于变量提升的,如果var声明的变量与function的函数同名,首先执行的是函数的声明(匿名函数不会提升)
2、执行阶段
- js从上向下,从左到右
变量提升
将所有变量声明和函数声明提升到所属作用域的顶端,即所谓的变量提升和函数提升。(如果声明不在任意函数内,则视为在全局作用域的顶部)
- 函数声明会置顶
- 变量声明也会置顶
- 函数声明比变量声明更置顶
- 变量和赋值语句一起书写,在js引擎解析时,会将其拆成声明和赋值两部分,声明置顶,赋值保留在原来位置
- 声明过的变量不会重复声明
作用域
全局作用域
- 在全局中定义的变量可以在任何地方使用
- 在页面打开的时候,浏览器会自动给我们生成一个全局作用域window
- 这个作用域一直存在,页面关闭就消失了
- 如果不写var,比如x = 8,会顺着作用域一直向上找,如果找不到就在全局声明一个
局部作用域
- 在局部作用域中定义的变量只能在这个局部作用域使用
- 每个函数,都是一个局部作用域
作用域链
- 在当前作用域中没有查到值,就会向上级作用域去查,直到查到全局作用域,形成一个链条
思考题
console.log(a);
a();
var a = 3;
function a() {
console.log(10);
}
console.log(a);
a = 6;
a();
function a() {
console.log(10);
}
var a ;
console.log(a);
a();
a= 3;
console.log(a)
a =6;
a();