3 回答

TA貢獻(xiàn)1825條經(jīng)驗(yàn) 獲得超6個(gè)贊
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | //A:函數(shù)聲明 sum(1,2);// 結(jié)果是:3 console.log(sum);//輸出 result: function sum(a,b){ return a+b; } //這里打印出來(lái)的是下面聲明的函數(shù) function sum(a,b){ return a+b; }(1,2);//函數(shù)表達(dá)式被前置處理,留下表達(dá)式 (1,2) 單獨(dú)運(yùn)算 result:2
----------------------------------------------------------------
//B:函數(shù)表達(dá)式 sum(1,2);//報(bào)錯(cuò) type error:sum is not a function ① console.log(sum);//輸出 result: undefined var sum=function(a,b){ return a+b; }(1,2);//可以立即調(diào)用 result:3
// 總結(jié): 主要區(qū)別,函數(shù)聲明,會(huì)被前置,可以理解為優(yōu)先運(yùn)算 // 函數(shù)表達(dá)式可以立即調(diào)用
// 補(bǔ)充: // ①:變量聲明,也會(huì)被前置,所以 B示例中 sum 的值是 undefined // 而不是報(bào) sum is not defined |

TA貢獻(xiàn)1828條經(jīng)驗(yàn) 獲得超3個(gè)贊
上述兩種方式除了定義的語(yǔ)法不同之外,最主要的區(qū)別是函數(shù)聲明具有【函數(shù)聲明提升】的特點(diǎn),將函數(shù)聲明提升到作用域頂端,意思是在執(zhí)行代碼之前會(huì)先讀取函數(shù)聲明,也就是說(shuō)可以把函數(shù)聲明放在函數(shù)調(diào)用的后面。
例子1:
1 2 3 4 5 | test();//彈出hello,因?yàn)椤竞瘮?shù)聲明提升】的特點(diǎn),函數(shù)調(diào)用之前,已經(jīng)讀取了該函數(shù)完成了聲明
function test(){ alert("hello"); } |
例子2:
1 2 3 4 5 6 7 8 9 | test();//報(bào)錯(cuò):Uncaught ReferenceError: test is not defined
//因?yàn)椤竞瘮?shù)表達(dá)式】不具備提升的特點(diǎn),在函數(shù)調(diào)用時(shí),作用域中還未讀取該函數(shù)的定義 //作用域讀取函數(shù)表達(dá)式是按照代碼順序讀取 var test = function(){ alert("hello"); }
test();//彈出hello |
例子3:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | if(condition){ function test(){ alert("hello"); } }else{ function test(){ alert("world"); } }
//彈出world,因?yàn)楹瘮?shù)聲明在代碼執(zhí)行前就已經(jīng)完成了,作用域已經(jīng)完成了對(duì)該函數(shù)的讀取,與條件無(wú)關(guān) //同名函數(shù)聲明,后面的會(huì)覆蓋前面的 test();
if(condition){ var test2 = function(){ alert("hello"); } }else{ var test2 = function(){ alert("world"); } } //彈出內(nèi)容與條件相關(guān),作用域讀取函數(shù)表達(dá)式是按照代碼執(zhí)行順序讀取的 test2(); |
例子4:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | //函數(shù)表達(dá)式 var test = function(){ alert("hello"); } //第一次調(diào)用 test();
//變量聲明 var s = "world";
//函數(shù)聲明 function test(){ alert(s); } //第二次調(diào)用 test();
//解釋:兩次調(diào)用都將彈出hello,在代碼執(zhí)行前方式二已經(jīng)被作用域讀取,然后執(zhí)行方式一代碼,方式一的test覆蓋方式二的test,然后執(zhí)行兩次調(diào)用彈出hello |
添加回答
舉報(bào)