javascript function 不寫函數名稱和寫函數名稱區別(轉載)
JavaScript中的Function對象是函數,函數的用途分為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函數的代碼又變成了后來定義的代碼。