情景一
当我们打印一个未定义的变量时
console.log(num)
抛出异常num未定义
Uncaught ReferenceError: num is not defined
情景二
当我们运行下面代码时
console.log(num)
var num = 10
输出undefined
为什么这里会返回undefined
?
情景三
fn();//正常执行
function fn(){
console.log('hello')
}
fn();//正常执行
由于是命名函数所有不管上面还是下面都可以正常实现
情景四
fun();//Uncaught TypeError: fun is not a function
var fun = function(){
console.log('hello')
}
fun();//正常执行
第一个fun()执行出错了
情景二和情景四到底有什么问题? 这里主要是因为JS的预解析造成的
js引擎运行分为两步:预解析和代码执行
预解析
js引擎会把js里面所有的var 还有function 提升到当前作用域的最前面 预解析分为变量预解析(变量提升)和函数预解析(函数提升)
情景二
出现undefined
的情况 由于变量提升情景二的代码其实最后是这样执行的// console.log(num)
// var num = 10
var num;
console.log(num)//undefined
num=10;
当然情景四也同理
2. 把所有的函数声明提升到当前作用域的最前面 这也解释了情景三
的执行是没有异常的
代码执行
按照代码顺序从上到下执行
预解析案例
下面代码执行的结果是什么?
fn();
console.log(c)
console.log(b)
console.log(a)
function fn(){
var a = b = c = 9;
console.log(a)
console.log(b)
console.log(c)
}
答案
9
9
9
9
9
Uncaught ReferenceError: a is not defined
分析
/*分析如下*/
//1.函数提升
function fn(){
/*1.1变量提升*/
var a;
a = b = c = 9;
// 相当于var a = 9 b = 9 c = 9
//b和c没有var 变成了全局变量
console.log(a)
console.log(b)
console.log(c)
}
//2.代码执行
fn();
console.log(c)//9
console.log(b)//9
console.log(a)//全局没有a变量 所有显示未定义