JS中的變數提示和函式提示問題
學習完後的總結:
Js程式碼分為兩個階段:編譯階段和執行階段; Js程式碼的編譯階段會找到所以的申明,並用合適的作用域將他們關聯起來,這個是詞法作用域的核心內容; 包括變數申明和函式聲名都會在程式碼被執行前的編譯階段首先被處理 提升:他們宣告操作會提升到執行環境的頂部,複製,邏輯操作符不變; 1.變數宣告: var a = 2; function foo(){ console.log(a);//undefined var a = 10; console.log(a);//10 } foo(); //等同於
function foo(){ var a;//先宣告提升在執行環境的頂部 console.log(a);//undefined a = 10; console.log(a);//10 } foo(); 2.函式宣告(函式宣告和函式表示式) 函式宣告:提升會在編譯階段宣告和函式體整體都提前到執行環境頂部,所以我們可以在函式宣告之前呼叫這個函式 函式表示式:其實就是變數宣告的一種,宣告操作會被提升到執行環境頂部,並複製undefined,賦值操作被留在原地等待執行; baz();//錯誤 var baz = function(){ console.log(200); } //相當於 var baz; baz(); baz=function(){ console.log(200); } 3.控制語句 Js中使用{}沒有作用域(函式及作用域不存在塊級作用域),所以普通塊中的宣告都會被提升到頂部,所以控制語句對宣告的控制就顯得完全沒有效果 if(false){ var a = 10; } console.log(a);//undefined //想當於 var a; if(false){ a = 10; } console.log(a);//undefined 奇怪的函式宣告 console.log(a);//undefined if(false){ function a(){ console.log(100); } } a();//錯誤找不到a()函式 //按道理如果因為if()無作用域所以a()為全域性函式應該會輸出為100;但是卻沒有說明了可能函式也只是提升了一個指標函式名為undefined,所以找不到a()函式 4.優先級別 提升操作會優先進行函式宣告,然後是變數,重複的變數申明會被忽視只剩下賦值操作,重複的函式宣告會被進行覆蓋; foo();//200被覆蓋 function foo(){ console.log(100); } function foo(){ console.log(200); } // console.log(foo);//(ƒ foo(){console.log(100);}相當於一個指標)函式宣告的提升高於變數宣告 function foo(){ console.log(100); } var foo = 100; 以上是我學習完後的理解,如果大佬們有不用意見可以告訴我,我在給予更改