詳解JavaScript中的函數聲明和函數表達式。本站提示廣大學習愛好者:(詳解JavaScript中的函數聲明和函數表達式)文章只能為提供參考,不一定能成為您想要的結果。以下是詳解JavaScript中的函數聲明和函數表達式正文
JavaScript 中須要創立函數的話,有兩種辦法:函數聲明、函數表達式,各自寫法以下:
// 辦法一:函數聲明 function foo() {} // 辦法二:函數表達式 var foo = function () {};
別的還有一種自履行函數表達式,重要用於創立一個新的感化域,在此感化域內聲明的變量不會和其它感化域內的變量抵觸或混雜,年夜多是以匿名函數方法存在,且立刻主動履行:
(function () { // var x = ... })();
此種自履行函數表達式歸類於以上兩種辦法的第二種,也算是函數表達式。
辦法一和辦法二都創立了一個函數,且定名為 foo,然則兩者照樣有差別的。JavaScript 說明器中存在一種變量聲明被晉升(hoisting)的機制,也就是說變量(函數)的聲明會被晉升到感化域的最後面,即便寫代碼的時刻是寫在最初面,也照樣會被晉升至最後面。
例如以下代碼段:
alert(foo); // function foo() {} alert(bar); // undefined function foo() {} var bar = function bar_fn() {}; alert(foo); // function foo() {} alert(bar); // function bar_fn() {}
輸入成果分離是function foo() {}、undefined、function foo() {}和function bar_fn() {}。
可以看到 foo 的聲明是寫在 alert 以後,依然可以被准確挪用,由於 JavaScript 說明器會將其晉升到 alert 後面,而以函數表達式創立的函數 bar 則不享用此待遇。
那末bar 畢竟有無被晉升呢,其適用 var 聲明的變量都邑被晉升,只不外是被先賦值為 undefined 而已,所以第二個 alert 彈出了 undefined。
所以,JavaScript 引擎履行以上代碼的次序能夠是如許的:
注:
嚴厲地說,再 JavaScript 中創立函數的話,還有別的一種辦法,稱為“函數結構法”:
var foo = Function('alert("hi!");'); var foo = new Function('alert("hi!");'); // 同等於下面一行
此辦法以一個字符串作為參數構成函數體。然則用這類辦法,履行效力方面會打扣頭,且仿佛沒法傳遞參數,所以罕用為妙。