知识点
-
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)