为什么 apply 尚未绑定到 Javascript 中的函数?

2023-11-23

假设,为了解决这个问题,我希望能够在 Javascript 中创建一个函数,将一个数组的所有元素附加到另一个数组。如果您有权访问目标数组,实现此目的的一种方法是:

var destination = [1,2,3];
var source = [4,5];
Array.prototype.push.apply(destination, source);
console.log(destination); // [1,2,3,4,5]

现在,由于 Array.prototype.push.apply 非常丑陋,我想将它别名为更好的东西,例如:

var pushAll = Array.prototype.push.apply;

我应该能够使用两个参数来调用它:上下文(目标)和参数数组(源)。但是,当我尝试使用别名时,会发生这种情况:

pushAll(destination, [6,7]);
TypeError: Function.prototype.apply was called on [object global], which
is a object and not a function

所以很明显apply函数没有绑定到push,这促使我尝试这个:

var pushAll = Function.prototype.apply.bind(Array.prototype.push);
pushAll(destination, [6,7]);
console.log(destination); // [1,2,3,4,5,6,7,8]

这显然工作得很好。我的问题是,为什么我必须绑定push方法才能应用? Array.prototype.push.apply 不应该已经绑定到 apply 了吗?为什么用不同的名称调用它会导致在未绑定的上下文中调用它?


为什么我必须绑定push方法才能应用?

反之亦然:您必须将 apply 方法绑定到 Array Push 函数 - 您也可以将其绑定到其他函数!否则apply不知道which与参数一起应用的方法。

Function.prototype.apply.bind(Array.prototype.push);确实调用了bind功能on the apply功能与push作为论证,论证on which apply然后被绑定。结果函数pushAll将在被调用时调用apply on the push函数,并将其参数(数组和参数数组)传递给它。

Array.prototype.push.apply 不应该已经绑定到 apply 了吗?

没有。 JavaScript 被设计为在函数调用时绑定上下文,而不是在它被称为属性时绑定上下文 -属性访问没有隐式绑定。否则Array.prototype.push已经被绑定到Array.prototype,然后您才能调用任何 Function 方法(如绑定/应用)并尝试在不同的上下文中使用它。

为什么用不同的名称调用它会导致在未绑定的上下文中调用它?

与其说是名字不同,不如说是风格不同。 (未绑定)函数确实得到了它们的this调用时设置给对象的值作为一种方法就其而言,即当对被调用函数的引用是属性访问时:destination.push().

这提供了很大的灵活性,您可以从对象“借用”函数并在其他对象上调用它们,仍然是相同的(未绑定)函数。这在函数对象不是一等对象的语言中是相当不可能的。

如果函数(即使它们本来就是方法)被称为普通函数(pushAll()), 他们的this值将是undefined(除非处于草率模式)。阅读更多关于this keyword at MDN.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 apply 尚未绑定到 Javascript 中的函数? 的相关文章

随机推荐

  • 绘制一个奇特的对角相关矩阵,其系数位于上三角形中

    我有以下内容合成的数据框 包括数值 and 绝对的列以及label柱子 我想绘制一个对角相关矩阵并在上部显示相关系数 如下所示 预期产出 尽管合成数据集 数据帧中的分类列df需要转换成数值 到目前为止我已经用过这个海伯恩的例子 using
  • 如何以角度获取前一个日期?

    请帮我获取 Angular 4 中之前的日期 currentdate Date this currentdate new Date console log this datePipe transform this currentdate y
  • 如何在 OpenNLP 中训练命名实体识别器标识符?

    好的 我有以下代码来训练来自 OpenNLP 的 NER 标识符 FileReader fileReader new FileReader train txt ObjectStream fileStream new PlainTextByL
  • 子集的积和

    这个操作有名字吗 并且 是否存在封闭式表达式 对于给定的 n 个元素集合 k 值介于 1 和 n 之间 获取 k 个项目的所有子集 组合 求每个子集的乘积 求所有这些乘积的总和 我可以用 Python 表达这一点 并且很容易地进行计算 fr
  • 用非IO事件中断epoll_wait,没有信号

    当前场景是 epoll wait 超过几个 fd 和一个可能传入消息的队列 我希望 epoll wait 下面的循环在 IO 事件或新消息上执行 我知道的方法 Use a time毫秒超时并在循环中首先检查队列 Use the 自管技巧当消
  • 当兼容模式打开时,Font Awesome 4.2.0 无法在 IE11 中呈现

    Font Awesome 4 2 0 在 Chrome Firefox Safari Opera 和 Internet Explorer 11 中完美呈现 但仅限于 关闭 兼容模式 当兼容模式打开 打开 时 不会渲染任何字形图标 我尝试过使
  • 嵌套有序列表与数字、字母和罗马数字的组合进行编号?

    我想创建一个如下所示的有序列表 1 Item 1 2 Item 2 a Subitem 1 b Subitem 2 I Sub Subitem 1 II Sub Subitem 2 c Subtiem 3 3 Item 3 即子列表应使用字
  • 修改 Info.plist 以在运行时设置“Application is agent(UIElement)”

    假设我需要让用户能够通过首选项面板选择是否将该应用程序用作 标准 带有停靠图标和菜单 或作为代理应用程序 仅带有状态栏菜单 我想我需要在执行期间以编程方式修改应用程序的 Info plist 将参数 应用程序是代理 更改为是 否 这是正确的
  • 内核模块中的 EXPORT_SYMBOL | insmod 期间未定义的符号

    我有一个来自 a ko 内核模块 的导出函数 foo 和 foo1 foo1 接受输入参数 一个函数指针 我从 b ko 调用 foo1 并将 foo 作为输入参数传递 我看到 b ko 未知符号 foo 的 insmod 失败 即使 a
  • Java 11 HttpClient - HttpClient 与并发 HttpRequest 的最佳比率是多少

    在下面的示例中 我创建一个 Java 11 httpClient 然后创建多个并发 HttpRequest 这是不好的做法吗 每个 HttpRequest 都应该有自己的 HttpClient 吗 HttpClient 可以拥有的 Http
  • 使用 gsub 删除第一个数字字符之前的所有字符串

    使用 gsub 删除 R 中第一个空格之前的所有字符串 在此示例中 我们尝试删除空格之前的所有内容sub 1 D name 我正在寻找非常相似的东西 但我对正则表达式不太熟悉 我想删除第一个数字字符之前的所有内容 但不删除它 例如 x lt
  • UI5控件的生命周期是如何运作的?

    有人可以更详细地解释 UI5 控件默认事件的生命周期吗 我知道有文档中的此页面它概述了控件生命周期 但是 我认为它非常简短 需要更详细的内容 有人可以列出控件事件的顺序并解释每个事件的作用吗 你是绝对正确的 控件生命周期的详细信息和实现细节
  • 如何使用 SSL/TLS 和/或消息级安全保护 RESTful php Web 服务

    我有一个用 php 编写的 RESTful Web 服务 它使用 JSON 进行通信 传输的一些数据确实很敏感 密码 我正在寻找一种方法来实现服务的合理安全级别 客户端是 silverlight 4 应用程序 我一直在寻找有关如何实施 SS
  • NodeJS 的 Web Sockets 服务器端实现

    这个问题的部分原因可能是客户端的讨论太多 让我只见树木不见森林 无论如何 这就是我想做的 我需要一个独立于平台的 WebSocket 服务器端实现 我希望它在 NodeJS 中运行 现在 我发现的有关该主题的内容 99 都与 socket
  • 如何使用照片框架快速循环浏览照片库

    我有一个应用程序 可以为我的应用程序上的每张门票创建一个独特的照片库 我需要弄清楚如何循环浏览该画廊 以便我可以一次将一张图像上传到服务器 我在 YouTube 上遵循了这些教程 Video 我目前使用 Swift 作为我的语言 我的最终目
  • 如何在 VC++ 中毒害标识符?

    功能中毒在 C 中是非常有用的技术 一般来说 它指的是使某个功能不可用 例如如果您想禁止在程序中使用动态分配 您可以 poison malloc 函数因此无法使用 中毒 标识符意味着 中毒 之后对标识符的任何引用都是硬编译器错误 例如 参见
  • Angular 6:错误类型错误:无法读取未定义的属性“toLowerCase”

    我正在以关于用户的角度六创建 CRUD 应用程序 当我尝试添加新用户时 出现以下错误 这是我收到的错误 core js 12301 ERROR TypeError Cannot read property toLowerCase of un
  • 基于 Microsoft Visual C++ Express 2010 的 64 位构建

    我正在尝试使用 Visual C Express 2010 将 VC 项目编译为 64 位 我知道 64 位编译器没有默认安装 VC Express 因此我按照此处指定的方式安装了适用于 Windows 7 的 Windows SDK ht
  • 使用 jQuery 在新窗口中打开所有外部链接

    这里是 jQuery 新手 我发现了几个网页与我想要做的事情很接近 但又不完全一样 其实我觉得以下是supposed实际工作 但它说 href http 无法识别 语法错误 有什么帮助吗 document ready function a
  • 为什么 apply 尚未绑定到 Javascript 中的函数?

    假设 为了解决这个问题 我希望能够在 Javascript 中创建一个函数 将一个数组的所有元素附加到另一个数组 如果您有权访问目标数组 实现此目的的一种方法是 var destination 1 2 3 var source 4 5 Ar