首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JavaScript调用和应用方法的目的是什么?

JavaScript调用和应用方法的目的是什么?
EN

Stack Overflow用户
提问于 2017-10-11 20:35:38
回答 1查看 61关注 0票数 1

在语言中调用和应用方法的目的是什么?

这似乎是违反OOP原则的反模式的一个例子。还是说它只是呈现了多范式的方法?

这个例子让我提出了这个问题。

在应用程序的一个地方(库的一部分)存在这样的代码。

代码语言:javascript
复制
socket.emit = function() {
    if (!socket.banned) {
      emit.apply(socket, arguments)
    }
 }

在应用程序的另一部分(自写的)中,有这样一段代码。

代码语言:javascript
复制
socket.emit = function(arguments){
    data = Array.prototype.slice.call(arguments);
    emit.apply(socket, data);
}

首先,如果禁止该对象,则该对象不应该工作。但第二部分对图书馆逻辑一无所知,独立工作。

如何解决这种情况?我们使用库来缓解最困难的部分。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-10-11 20:41:52

Function.prototype.call的存在只有一个目的,这是为了允许使用特定的this值调用函数,即作为第一个参数传递的函数。

Function.prototype.apply也是一样的,但是在调用函数时,作为第二个参数传递的数组被拆分成多个参数。当您想要调用一个函数,该函数接受一个变量大小的参数列表,但是在数组中准备好了这些参数,而不是作为单独的值,这是非常有用的。

Math.max为例。如果我有一组未知的大小,并且我希望找到最大的一组,有两种方法:

  1. 依次将每个元素与当前最大值进行比较,直到找到最大的
  2. 将它们直接传递给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原则无关。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46697083

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档