2013-03-26 20 views
1

this article,約翰Resig的討論了這個片斷爲討好:困惑Resig的咖喱例子,「論據」對象

Function.prototype.curry = function() { 
    var fn = this, args = Array.prototype.slice.call(arguments); 
    return function() { 
     return fn.apply(this, args.concat(
     Array.prototype.slice.call(arguments))); 
    }; 
    }; 

我感到困惑的表達Array.prototype.slice.call(arguments)

  1. 這裏的「論據」是「這個」參數數組的slice()方法,但「切片()」需要一個參數本身,所以我想你需要做類似Array.prototype.slice.call(arguments, <someIndex>)。我不明白代碼可以如何工作。

  2. 根據the docs on "arguments",「參數」實際上不是一個數組,而只是一個像對象這樣的數組。我們如何調用「slice()」?如果我把代碼console.log(arguments.slice())我得到一個錯誤,說對象沒有切片方法。

這是怎麼回事?

+3

Resig voodoo,你所有的代碼都屬於John! – adeneo 2013-03-26 20:58:27

+0

@Xander,不,它沒有明確地討論,儘管我認爲片段可能來自原型庫。 – Jonah 2013-03-26 21:15:51

回答

4

答到的第一個問題:

如果調用切片不帶參數的陣列上,它只是返回數組的一個副本。 Array.prototype.slice.call(arguments)的確如此,但在arguments對象上運行,返回一個數組。

答到第二個問題:

我們可以在arguments稱之爲片,因爲它是一個「通用」的方法(見注here)。當您將arguments對象作爲this時,slice會將其視爲一個數組。由於arguments是一個array-like object,它包含一個length屬性,它只是工作。

+0

@Pointy:根據需要列出startIndex時文檔是否錯誤? https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/slice – Jonah 2013-03-26 21:06:20

+1

看來你對錯誤的答案發表了評論! :)但我想我知道你的問題的答案:規範說第一個參數被轉換爲一個帶有「ToInteger」的int,當你傳遞undefined時它恰好返回0。看到http://es5.github.com/#x9.4和http://es5.github.com/#x9.3 – bfavaretto 2013-03-26 21:09:37

+0

其實,不是一個錯誤。您會自動收到通知,但我必須通過@Pointy來通知他。所以我只是這樣做,而不是在你的兩個答案中提出同樣的問題:) – Jonah 2013-03-26 21:13:35

3

.slice()的參數是可選的。如果它不存在,函數只返回原始數組(或類似數組的對象)的副本。

.slice()函數只關心this對象上「length」屬性的存在。因此,因爲「參數」具有「長度」屬性,所以.slice()很高興。

+0

棘手的,請參閱bfavaretto對後續問題的回答的評論(我對你們都有同樣的問題)。謝謝。 – Jonah 2013-03-26 21:17:54

+0

@Jonah你現在都準備好了嗎?看起來像bfavaretto提供了典型的美妙答案,但隨時可以提出更多問題。參數對象是一件奇怪的事情。 – Pointy 2013-03-26 21:25:49

+0

尖尖的,是的,我現在很好。謝謝你的幫助! – Jonah 2013-03-26 21:34:21