函式宣告與函式表示式及變數宣告提公升的底層實現

2021-09-02 11:42:25 字數 1724 閱讀 7112

函式宣告與函式表示式

疑問1: 

var aa = function () 

function aa()

aa() //2

function aa() 

var aa = function ()

aa() //2

疑問2: 

function aa() 

var bb=aa;

aa = function();

aa() //2

bb() //1

function aa() 

var bb=aa;

function aa()

aa() //2

bb() //2

找的乙個解釋,但是依舊存疑。他這說法不太靠譜

函式的宣告比變數的宣告的優先順序要高

1 function text6()

3 var a;

4 log(a); //列印出a的函式體

5 6 var b;

7 function b() {}

8 log(b); //列印出b的函式體

9 10 // !注意看,一旦變數被賦值後,將會輸出變數

11 var c = 12

12 function c() {}

13 log(c); //12

14

15 function d() {}

16 var d = 12

17 log(d); //12

18 }

19 text6();

另一種較為合理的解釋 

即所有宣告變數或宣告函式都會被提公升到當前函式的頂部。

例如下**:

console.log('x' in window);//true

var x;

x = 0;

//**執行時js引擎會將宣告語句提公升至**最上方,變為:

var x;

console.log('x' in window);//true

x = 0;

var getname 與 function getname 都是宣告語句,區別在於 var getname 是函式表示式,而 function getname 是函式宣告。關於js中的各種函式建立方式可以看 大部分人都會做錯的經典js閉包面試題 這篇文章有詳細說明。

函式表示式最大的問題,在於js會將此**拆分為兩行**分別執行。

例如下**:

console.log(x);//輸出:function x(){}

var x=1;

function x(){}

實際執行的**為,先將 var x=1 拆分為 var x; 和 x = 1; 兩行,再將 var x; 和 function x(){} 兩行提公升至最上方變成:

var x;

function x(){}

console.log(x);

x=1;

所以最終函式宣告的x覆蓋了變數宣告的x,log輸出為x函式。

函式宣告與函式表示式

對函式宣告和表示式加以區別 在解析器向執行環境中載入資料時,對函式宣告和函式表示式並非一視同仁。解析器會先率先讀取函式宣告,並使其在執行任何 之前可以呼叫 至於函式表示式,則必須等到解析器執行到它所在的 行,才會真正被解釋執行。函式宣告 alert hello 返加值 hello function ...

函式宣告與函式表示式

1 function sum num1,num2 1 function sum num1,num2 解析器在向執行環境中載入資料時,會率先讀取函式宣告,並使其在執行任何 前可用 可以訪問 而函式表示式,必須等到解析器執行到他所在的 行,才會被真正解析執行。其它情況都是相同的。1 正常執行 2 ale...

js函式宣告與函式表示式

function a 這種叫函式宣告,function var fn function var fn function a 這種是函式表示式,var fn function a 中的a相當於乙個函式區域性變數,只能在這個函式內部使用,如var fn function fib n else 在函式外部...