2017-10-11 36 views
1

在語言中調用和應用方法的目的是什麼?JavaScript的調用和應用方法的目的是什麼?

這似乎是反模式的一個例子,它打破了OOP原則。或者它只是提出了多範式的方法?

這個例子讓我問這個問題。

在一個地方應用(庫的一部分)的有這樣的代碼

socket.emit = function() { 
    if (!socket.banned) { 
     emit.apply(socket, arguments) 
    } 
} 

在應用(個體寫的)有這樣一段代碼

socket.emit = function(arguments){ 
    data = Array.prototype.slice.call(arguments); 
    emit.apply(socket, data); 
} 

在的另一部分如果被禁止,該對象不應該工作的第一個地方。但第二部分對圖書館邏輯一無所知並且獨立工作。

這種情況如何解決?我們使用庫來緩解最困難的部分。

+2

目的是用特定的調用上下文,'this'和任意數量的'arguments'來調用一個函數。除此之外,你不知道你需要知道什麼。如果這是一個關於編程原則的問題,也許這更適合[軟件工程](https://softwareengineering.stackexchange.com/)。 –

+0

在你的第二種情況下,你爲什麼選擇'arguments'作爲你的形式參數?這樣做會影響'arguments'對象,因爲標識符'arguments'現在引用函數的第一個參數,而不是稱爲'arguments'的默認對象,它可以訪問傳遞給函數的所有參數。你是否期望'emit'被類似數組的對象作爲第一個參數調用?如果你的'emit = function(firstArg){...'和'slice.call(firstArg);'功能會更清晰。 – apsillers

回答

3

Function.prototype.call存在對於僅一個目的,這是允許的功能與this特定值被調用,即該真實作爲第一個參數傳遞的一個。

Function.prototype.apply是一樣的,但增加的優點是當作爲第二個參數傳遞的數組被分成多個參數當該函數被調用時。當你想調用一個函數時,這個函數非常有用,該函數接受一個可變大小的參數列表,但是你可以將這些參數準備好在一個數組中而不是單獨的值。例如,。如果我有一組未知大小的,我希望找到最大的有兩種方法:

,直到你直接找到最大的

  • 通個個

    1. 依次比較針對當前最大的每個元素到Math.max

    我不能撥打Math.max(a, b, c, etc)因爲我不知道有多少變數。相反,我可以撥打Math.max.apply(null, myArray)並將其擴展爲Math.max(myArray[0], myArray[1], etc)

    NB1:在ES6 .apply沒有嚴格要求了,因爲你可以使用.call...傳播經營者,例如Math.max.call(null, ...myArray)

    NB2:這有什麼也沒有與破壞面向對象的原則。

  • 相關問題