2014-09-02 76 views
-1

我想問一個關於JavaScript的問題call()函數。我已經開始學習JavaScript到深處,我卻無法和這個例子中,我得到的結果明白。爲什麼:關於JavaScript調用函數

var args = Array.prototype.slice.call(arguments); 

,並用這個我收到提示:

var args = Array.prototype.call(arguments); 

這兩個函數都存在於Array的__proto__之內,因爲我知道Array是extend Function。在這個例子中返回true Array.__proto__ === Function.prototype

回答

4

類型:

typeof(Array.prototype.slice) 
> "function" 

(這是一個函數,你可以使用call - 見Function.prototype.call

typeof(Array.prototype) 
> "object" 

(這不是一個功能,你可以」 t使用call - 「看不到Object.prototype.call

+0

不明白點..你能解釋一下嗎? – Victorino 2014-09-02 21:19:08

+0

@Victorino你不明白什麼?你只能'調用'一個函數,'Array.prototype'不是函數。這是什麼讓你困惑,特別是。 – 2014-09-02 21:24:43

+0

現在我明白了。謝謝 – Victorino 2014-09-02 21:27:38

4

call是一個函數的方法。 Array.prototype.slice是一個函數,但Array.prototype不是這樣,它沒有call方法。

1
Array.__proto__ === Function.prototype 

呵呵。我認爲你已經偶然發現了一些內部實現,實際上並不是它的工作原理。根據您在計算機科學/軟件工程方面的實際經驗,我傾向於建議忽略這個特別的人爲因素。

Prototype是Object類的一個實例,它們沒有call方法(除非它是由用戶或庫定義的)。因此,Whatever.prototype.call應該按預期調用錯誤。

另一個perculiar行爲:

對象的instanceof功能 // - >真 功能的instanceof對象 // - >真

+0

感謝您的建議,我會考慮到它。正如我現在關於一個原型鏈,這是這樣的'陣列 - >>功能 - >>對象',我錯過了一些東西? – Victorino 2014-09-02 21:36:08