


原因是浏览器执行js代码之前,会有一个预解析的过程:
浏览器中有一段程序专门用来解析js代码, 叫做js解析器。js解析器在执行js代码的时候,分两步进行:
预解析js代码
预解析的过程,就是查找代码中的var和function这两个关键字,找到以后,将变量和函数提前存到内存中,并给他们赋一个初始值,变量的初始值为undefined,函数的初始值为代码段。
开始按顺序一行一行解读代码
解读代码的时候,会略过变量和函数的定义,因为变量和函数的定义已经提前放在内存中了,提前储存的变量和函数的值会随着代码的解读而发生变化,也就是变量的赋值和函数的调用。
预解析分为变量的预解析和函数的预解析,也就是代码在执行之前先进行解析,将变量和函数的定义放在内存中。
但是在打印之后声名过变量的话,情况就不一样了。




练习题
// 第1题
console.log(num)
var num = 100 un
// 第2题
fn();
function fn() {
console.log(123);
} 123
// 第3题
console.log(fn) un
fn()
var fn = function () {
console.log(123);
} 123
// 第4题
fun()
var fn = function () {
console.log('我是 fn 函数')
}
function fun() {
console.log('我是 fun 函数')
}
fn()
fn = 100
fn()
// 第5题
fn()
function fn() {
console.log('我是一个 fn 函数')
}
fn()
var fn = 100
fn()
// 第6题
var fun = 200
fun()
var fun = function () {
console.log('我是一个 fun 函数')
}
fun()
// 第7题
var a = b
a = 0
b = 0
console.log(a)
console.log(b)
// 第8题
console.log(num)
if (false) {
var num = 100
}