![](/img/trans.png)
[英]What's the purpose of using Function.call.apply in JavaScript?
[英]What is the purpose of JavaScript's call and apply methods?
語言中調用和應用方法的目的是什么?
它似乎是打破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);
}
首先,如果禁止該對象,則該對象不起作用。 但是第二部分對庫邏輯一無所知並且獨立工作。
如何解決這種情況? 我們使用庫來緩解最困難的部分。
Function.prototype.call
僅用於一個目的,這是為了允許使用this
的特定值調用函數,即作為第一個參數傳遞的函數。
Function.prototype.apply
是相同的,但附加的優點是,當調用函數時,作為第二個參數傳遞的數組被拆分為多個參數 。 當您想要調用一個采用可變大小的參數列表的函數但是您已在數組中准備好這些參數而不是單個值時,這非常有用。
以Math.max
為例。 如果我有一組未知的大小,我希望找到最大的有兩種方法:
連續比較每個元素與當前最大值,直到找到最大值
將所有這些直接傳遞給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:這與違反OOP原則無關 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.