函式宣告與函式表示式
疑問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 在函式外部...