解決方法
仔細再看一下到底你是如何調用apply
的。。。
你可能在使用Function.prototype.apply的時候不夠熟練,把call
和apply
的用法混在一起。。。。call
是用0個或者更多的arguments,而apply
則是用一個數組。
錯誤例子
|
|
正確例子
|
|
細節
當調用Function.prototype.apply
的時候,它會調用內置抽象操作:CreateListFromArrayLike
。
CreateListFromArrayLike
CreateListFromArrayLike ( obj [ , elementTypes ] )
CreateListFromArrayLike 是一個ECMAScript的內置抽象操作 (Abstract Operation),用於建立一個List的值,它的元素由類似數組的對象的索引屬性提供。elementTypes
是一個List,只允許自身建立的list
擁有ECMAScript Language 類型的值,比如undefined, null, boolean
等。在調用的時候,它會執行以下步驟:
- 如果沒有定義
elementTypes
的話,它會被定義為« Undefined, Null, Boolean, String, Symbol, Number, Object »。 - 如果
Type(obj)
的類型不是Object,拋出TypeError 錯誤。 - 定義
len
為obj
的length。 - 建立一個空的List
list
。 - 定義
index
為0 - 當index小於len的時候,重複以下步驟:
- 定義
indexName
為!ToString(index) - 定義
next
為?Get(obj, indexName) - 如果
Type(next)
的類型不存在於elementType
裡面,拋出TypeError 錯誤。 - 在
list
的最後增加next //list.push(next)
index
的值加1
- 定義
- 返回
list
延伸閱讀
- 看V8是怎樣實現
Function.prototype.apply
- 看V8是怎樣實現
CreateListFromArrayLike