在JavaScript高級程式設計書中看到 因此,要模擬出重載的效果,只有兩種方法:1.參數的類型;2.參數的數量 本人一開始學會的通過參數類型來實現重載的方法 用Switch 語句通過參數類型來模擬出重載效果。 關於Switch 語句還有個有個小技巧:case的連續執行 當執行函數sum('sum ...
在JavaScript高級程式設計書中看到
ECMAScript函數中不能想傳統意義上那樣實現重載。而在其他語句中(Java)中,可以為一個函數編寫兩個定義,只要兩個定義的簽名(接受的參
數的類型和數量)不同即可。如前所述,ECMAScript函數沒有簽名,因為其參數是由包含多個值的數組來表示的。而沒有函數簽名,真正的重載是不可做到
的。但是ECMAScript函數可以通過檢查傳入函數中的參數的類型和數量並做出不同的反應,可以去模擬方法的重載。
深入理解的例子:
function addsomeSomeNumber(num){
return num+=100;
}
function addsomeSomeNumber(num){
return num+=200;
}
addsomeSomeNumber(100)//300
顯然,這個例子中聲明瞭兩個同名函數,而結果則是後面的函數覆蓋了前面的函數。
因此,要模擬出重載的效果,只有兩種方法:1.參數的類型;2.參數的數量
本人一開始學會的通過參數類型來實現重載的方法
function sum(type,a,b){ switch(type) { case 'sum': return a+b; break; case 'mul': return a*b; break; } }
用Switch 語句通過參數類型來模擬出重載效果。
關於Switch 語句還有個有個小技巧:case的連續執行
function sum(type,a,b){ var s=0; switch(type) { case 'sum': s += a+b; case 'mul': s += a*b; return s; break; } }
當執行函數sum('sum',1,2)時,他會執行出值,明明case 'sum'沒有return,也會有值,因為函數沒遇到break,它也運行了case ‘mul’的函數。
當然重載還有別的方式實現,下麵就介紹argument,在JavaScript高級程式設計是這麼寫的
在ECMAScript中的參數在內部用一個數組(類數組)來表示。在函數體內可以通過arguments對象來訪問這個參數數組,從而獲取函數每一個參數。 arguments對象只是與數組類似(它並不是Array的實例),因為可以使用方括弧語法訪問ta它每一個元素(即第一個元素是arguments[0]以此類推), 使用length屬性來確定他傳遞進來多少個參數。
故可以用 arguments.length 來實現重載
var HeavyLoad = function () { var length = arguments.length; //獲取函數實參的個數 if (length === 0) { console.log('no-param'); return this; } else if(length === 1) { console.log('1'); return this; } else if(length ===2) { console.log('2'); return this; } else { console.log('3'); return this; } };
HeavyLoad('a','b','c') //3
也可以根據傳參的類型來重載
var HeavyLoad= function () { if (typeof arguments[0] === 'number') { console.log('number'); } if (typeof arguments[0] === 'string') { console.log('string'); } }; HeavyLoad(1) //number
遞歸階乘函數的實現
arguments.callee是一個指向正在執行的函數指針,因此用它來是實現對函數的遞歸調用。(註釋下js是單線程的,所以指向正在執行的函數,就是指向自己)
function factorial(num){ if(num <= 1){ return 1; } else{ return num * arguments.callee(num-1); } }