就是在代碼執行之前,對代碼進行通讀解釋
只解析兩個內容:
? ? ? ? (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博客