浅谈JavaScript代码预解析 + 示例详解

7次阅读

共计 1192 个字符,预计需要花费 3 分钟才能阅读完成。

知识点

var 声明的变量在预解析的时候只执行声明,不会执行定义,默认值是 undefined。

function 声明的函数在预解析的时候会提前声明并且会同时定义。
变量名重复声明无效
预解析过得代码不会再执行阶段执行

示例一
console.log(a); // 打印函数 a 函数体(function a() { console.log(‘a’) })

var a = 10;

console.log(a); // 10

function a() { console.log(‘a’) }

console.log(a); // 10
预解析过程

首先预解析到有变量 a 存在,因此记录下 a 这个名字,和其值 undefined

接着预解析到有函数 a 声明,记录下函数名 a

但是发现已经记录了一个 a,因此该操作无效,将函数体与 a 这个名字相关联
解析完毕

预解析过程代码

a = undefined
a = function () { console.log(‘a’) }

预解析结果
a = function () { console.log(‘a’) }
执行过程

打印变量 a 的值 function a() { console.log(‘a’) }

变量 a 赋值为 10,将原来关联的函数覆盖
打印变量 a 的值 10

打印变量 a 的值 10

执行完毕

执行过程代码

console.log(a)
a = 10
console.log(a)
console.log(a)

示例二
console.log(fn) // 函数 fn 函数体(function fn() { console.log(2) })

function fn() { console.log(1) }

console.log(fn) // 函数 fn 函数体(function fn() { console.log(2) })

var fn = 10

console.log(fn) // 10

function fn() { console.log(2) }

console.log(fn) // 10
预解析过程

首先预解析到有函数 fn 声明,因此记录 fn 这个名字,并关联其函数体
接着预解析到变量 fn 声明,记录下变量名 fn

但是发现已经记录了一个 fn,因此该操作无效
接着预解析到有函数 fn 声明,因此记录 fn 这个名字
但是发现已经记录了一个 fn,因此该操作无效,接着关联其函数体
解析完毕

预解析过程代码

fn = function () { console.log(1) }
fn = function () { console.log(2) }

预解析结果
fn = function () { console.log(2) }
执行过程

打印变量 fn 的值 function fn() { console.log(2) }

打印变量 fn 的值 function fn() { console.log(2) }

变量 fn 赋值为 10,将原来关联的函数覆盖
打印变量 fn 的值 10

打印变量 fn 的值 10

执行完毕

执行过程代码

console.log(fn)
console.log(fn)
fn = 10
console.log(fn)
console.log(fn)

正文完
 0