就是在代码执行之前,对代码进行通读解释
只解析两个内容:
(1)对var声明的变量
(2)声明式函数
(1)对var声明的变量进行提前声明,但不赋值
javascriptvar 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 num num=1 function f1(){ var num //函数内部num和外部互不影响 num=2 console.log(num) //2 } function f2(){ console.log(num) //1 } f1(); f2(); */
(2)声明式函数
对函数进行提前声明,并且直接赋值为一个函数
javascript// 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();
解答:
javascript/* 1 函数声明会在预解析阶段被提升到作用域顶部 正常执行 */ /* 2 var bar bar() bar=function(){ console.log("Bar function"); }; 会抛出错误 因为在执行时bar还没有被定义 尽管变量声明会被提升 但是函数表达式的赋值不会提升 因此在赋值之前调用会失败。 */ /* 3 这里会抛出错误 function outer() { var inner inner(); // 此时inner定义未赋值时undefined inner= function () { console.log("Inner function"); }; } outer(); */