函数预解析:
提示:
在代码执行以前,对代码进行通读并解释
js是弱类型解释型的脚本语言
预解析只解析两个内容:
- var 声明的变量
- 声明式的函数
注意事项:
打开浏览器 只解析全局代码 不会对函数内的代码 进行预解析 函数内的代码 会在调用函数的时候 进行预解析
var 声明的变量:
提示:
提前进行声明 但是不赋值 相当于 这是准备一个空箱子 但是什么都不放
声明式的函数:
提示:
对函数名进行声明,并且赋值为一个函数 相当于准备了一个空箱子 并且把函数放进去 赋值式的函数按照 var 的规则进行解析 也是只准备空箱子 但是什么都不放
var 的预解析:
var num = 100; console.log(num); 打开浏览器 var num = 100; console.log(num); 预解析: 1.var num = 100; 这一行需要预解析 声明一个变量起名 叫num 但是不赋值 2.console.log(num); 这一行不预解析 代码执行: 1.var num = 100; 将100放到 名字叫num的箱子里 2.console.log(num);将100 输出到控制台 console.log(num); // num is not defined var num = 100; console.log(num); // 100 打开浏览器: 1.console.log(num); 2.var num = 100; 3.console.log(num); 预解析: 1.不预解析 2.预解析 声明一个变量叫num 但是不赋值 3.不需要预解析 执行: 1. console.log(num); 打印num变量中的值 // num 在预解析阶段声明了但是没有被赋值 所以会打印undefined 2. 将100 放到容器中 3. console.log(num); 100
声明式的函数:
// fn(); // function fn(){ // console.log("我是函数"); // } // fn(); // 打开浏览器 // 1.fn() // 2. function fn(){ console.log("我是函数"); } // 3. fn(); // 预解析 // 1. 不需要 // 2. 需要 声明一个fn的变量 并且赋值为一个函数 // 3. 不需要 // 执行阶段 // 1. 正常调用 // 预解析阶段 已经完成了声明 并且里边是个函数 // 2. fn(); 跟上面 一样 正常调用 // 等价于 // function fn(){ console.log("我是函数"); } // fn(); // fn();
赋值式函数预解析:
//赋值式的函数 // fn2(); // var fn2 = function(){ // console.log("我是赋值式的函数"); // } // fn2(); // 打开浏览器 // 1. fn2(); // 2. var fn2 = function(){ console.log("我是赋值式的函数"); } // 3. fn2(); // 预解析 // 1. 不需要 // 2. 需要 声明一个fn2的变量 但是不赋值 // 3. 不需要 // 执行 // 1. fn2(); // 预解析阶段 fn2仅仅是 声明了一个变量 但是没有赋值 // 此时fn2是一个undefined 我们fn2() 加了一个括号 // 当成函数来调用 结果是 fn2 is not a function // 2. 将一个函数赋值给fn2 fn2此时变成了一个函数 // 3. fn2(); fn2里边是一个函数 /// fn2()当做一个函数来调用 // 正常调用
函数内预解析:
function fn3(){ var num = 100; console.log(num); } fn3(); // 预解析 // 1. 需要 声明一个fn3的变量 并且赋值为一个函数 // 2. 不需要 // 执行阶段 // fn3(); // 预解析阶段 fn3已经声明了 并且里边是一个函数 // 当做函数正常调用 // 开始对函数内的代码进行预解析 // 1.声明变量 但是不赋值 // 函数内代码预解析完成 然后执行 // 1. 把100 赋值给num // 2. 打印num