就是在代码执行之前,对代码进行通读解释
只解析两个内容:
(1)对var声明的变量
(2)声明式函数
(1)对var声明的变量进行提前声明,但不赋值
var x console.log(x) //undefined//分别输出几? var num = 1; function f1() {num = 2;var num;console.log(num) } function f2() {console.log(num) } f1(); f2();/*通读var numnum=1function f1(){var num //函数内部num和外部互不影响num=2console.log(num) //2}function f2(){ console.log(num) //1}f1();f2(); */
(2)声明式函数
对函数进行提前声明,并且直接赋值为一个函数
// 1.会正常执行吗? foo(); function foo() {console.log("Hello, world!"); }// 2.会抛出错误吗?为什么? bar(); var bar = function() {console.log("Bar function"); };function outer() {inner(); // 3.这里会怎样?var inner = function() {console.log("Inner function");}; } outer();
解答:
/*1函数声明会在预解析阶段被提升到作用域顶部正常执行 *//*2var barbar()bar=function(){console.log("Bar function");};会抛出错误因为在执行时bar还没有被定义尽管变量声明会被提升但是函数表达式的赋值不会提升因此在赋值之前调用会失败。 *//*3这里会抛出错误function outer() {var innerinner(); // 此时inner定义未赋值时undefinedinner= function () {console.log("Inner function");};}outer();*/
下一篇:11.作用域及作用域链-CSDN博客