扩展: 报错信息
Uncaught TypeError: Cannot read property 'toString' of undefined
=> 你的代码里面一定有一个 xxx.yyy
=> 之所以报错, 因为 xxx 是 undefined
Uncaught TypeError: Cannot read property 'toString' of null
=> 你的代码里面一定有一个 xxx.yyy
=> 之所以报错, 因为 xxx 是 null
预解析案例
-
有 变量 的解析
-
有 声明式函数 的解析
-
问题: 变量名 和 函数名 重名了
-
当 函数 和 变量 重名的时候, 在预解析阶段以函数为准
扩展: 报错信息
-
Uncaught TypeError: fn is not a function
-
当你看到它的时候
=> 我前面的代码是不是用过 fn 这个变量了
*/
// fn()
// var fn = 100
// fn() -----------报错,因为上面给fn赋值了
// function fn() {
// console.log('我是 fn 函数')
// }
// fn()
/*
预解析
\1. var fn
\2. function fn() { ... }
-
声明 fn 变量
-
声明 fn 变量 并且赋值为一个函数
-
预解析结束的时候, 浏览器记录的 fn 变量是一个函数
代码开始执行
\1. fn() // 把 fn 当做函数执行
\2. fn = 100 // 给 fn 赋值为 100, 当你给他赋值为 100 的时候, fn 记录的函数没有了
\3. fn() // 把 fn 当作函数执行, fn 的值式 100, 报错, 程序中断
\4. fn()
*/
// fn()
// function fn() {
// console.log('我是 fn 函数')
// }
// fn()
// var fn = 100
// fn()
/*
fn()
function fn() {
console.log('我是 fn 函数')
}
fn()
var fn = 100
fn()
预解析的时候
\1. function fn() {}
\2. var fn
代码执行
\1. fn()
\2. fn()
\3. fn = 100
\4. fn()
*/
// // 第一天
// var fn = 100
// // 第二天
// function fn() {}
// fn()