javascript function 不寫函數名稱和寫函數名稱區別(轉載)

chyx413332087 13年前發布 | 11K 次閱讀

JavaScript中的Function對象是函數,函數的用途分為3類:

  1. 作為普通邏輯代碼容器;
  2. 作為對象方法;
  3. 作為構造函數。

這里重點只討論第二種。

創建函數實例的方式有3種:

    第一種是聲明式,即像聲明變量一樣,將通過function(){}標識符創建的匿名函數直接賦值給變量,以該變量作為調用時的函數名稱:

    第二種是定義式,即以function關鍵字后跟函數名稱及(){}來直接定義命名函數,前面第一個multiply函數就是通過定義式創建的。

    第三種是構造函數式,即通過new運算符調用構造函數Function來創建函數。這種方式極不常用,因此就不作介紹了。

首先談一下聲明式:

var a = function () {
   alert("a");
}
a();
var a = function () {
   alert("aa");
}
a();

他們是沒有帶具體名稱的函數,其結果是:a,aa....

再是定義式:

function b() {
   alert("b");
}
b();
function b() {
   alert("bg");
}
b();

他們都有自己的函數名稱,其執行結果就不一樣了。他們的結果是:bg、bg.這里的執行結果有些人就不清楚了,為什么會這樣呢?這就要從JavaScript解釋引擎機制上說了,當你知道了JavaScript解釋引擎機制的時候你就會很輕松的能夠理解這樣的結果了。

JavaScript解釋引擎機制的這樣的:在采用定義式創建同名函數時,后創建的函數會覆蓋先創建的函數。這種差別是由于JavaScript解釋引擎的工作機制所導致的。JavaScript解釋引擎在執行任何函數調用之前,首先會在全局作用域中注冊以定義式創建的函數,然后再依次執行函數調用。由于注冊函數時,后定義的函數重寫了先定義的函數,因此無論調用語句位于何處,執行的都是后定義的函數。相反,對于聲明式創建的函數,JavaScript解釋引擎會像對待任何聲明的變量一樣,等到執行調用該變量的代碼時才會對變量求值。由于JavaScript代碼是從上到下順序執行的,因此當執行第一個example()調用時,example函數的代碼就是首先定義代碼;而當執行第二個example()調用時,example函數的代碼又變成了后來定義的代碼。

 本文由用戶 chyx413332087 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!