我正在讀Secrets of the JavaScript Ninja和我看到這個代碼產生一個函數過載:JavaScript和功能超負荷澄清
function addMethod(object, name, fn)
{
var old = object[name];
object[name] = function()
{
if(fn.length == arguments.length) return fn.apply(this, arguments)
else if(typeof old == 'function') return old.apply(this, arguments);
};
}
function Ninjas()
{
var ninjas = ["Dean Edwards", "Sam Stephenson", "Alex Russell"];
// addMethod is defined in Listing 2-28
addMethod(this, "find", function()
{
return ninjas;
});
addMethod(this, "find", function (name)
{
var ret = [];
for(var i = 0; i < ninjas.length; i++)
if(ninjas[i].indexOf(name) == 0) ret.push(ninjas[i]);
return ret;
});
addMethod(this, "find", function (first, last)
{
var ret = [];
for(var i = 0; i < ninjas.length; i++)
if(ninjas[i] == (first + " " + last)) ret.push(ninjas[i]);
return ret;
});
}
var ninjas = new Ninjas();
assert(ninjas.find().length == 3, "Finds all ninjas");
assert(ninjas.find("Sam").length == 1, "Finds ninjas by first name");
assert(ninjas.find("Dean", "Edwards").length == 1, "Finds ninjas by first and last name");
assert(ninjas.find("Alex", "X", "Russell") == null, "Does nothing");
function assert(a,b)
{
if (a==true) console.log(b) ; else console("----");
}
據我明白了,addMethod
始終保持功能的old
值(通過閉合) 。
因此,最後,還有一個功能它檢查的條件,如果失敗,它會調用old
函數又做同樣的事情。
但是我不明白的arguments.length
評價(我知道function().length
和argument.length
之間的差異)。
要其矩形不arguments
指什麼?
我跟蹤它的調試器,而且我感到困惑,因爲在第一,功能寄存器(所以arguments.length
是3 [(object, name, fn)]
,但後來它被調用所以現在有另一個論據。
這是怎麼工作
[開'arguments' MDN文檔(https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Functions_and_function_scope/arguments)可能的援助。 – 2013-03-04 07:10:51