阅读 58

变量与函数的提升(ES5)

变量与函数的提升

背景

浏览器中的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();

复制代码
文章分类
前端
文章标签