在javascript中调用并应用[重复]

2023-11-30

可能的重复:
链调用和apply在一起是什么意思?

我发现了一些这样的代码:

function fun() {
    return Function.prototype.call.apply(Array.prototype.slice, arguments);
}

我知道call and apply在js中,但是当它们组合在一起时我很困惑。

然后我想知道是否

Function.prototype.call.apply(Array.prototype.slice, arguments)

是相同的 :

Array.prototype.slice.apply(arguments);

如果没有,第一行是做什么的?


好吧,让我们通过替换来解决这个问题。我们从以下开始:

Function.prototype.call.apply(Array.prototype.slice, arguments);

我们所知道的:

  1. Function.prototype.call是一个函数。
  2. The this的指针call指着Function.prototype.
  3. We use apply改变this的指针call to Array.prototype.slice.
  4. arguments is applied(不作为参数传递)到call.

因此上面的语句等价于:

Array.prototype.slice.call(arguments[0], arguments[1], ...);

由此我们看出:

  1. Array.prototype.slice是一个函数。
  2. The this的指针slice指着Array.prototype.
  3. We use call改变this的指针slice to arguments[0].
  4. arguments[1], ...作为参数传递给slice.

这与:

arguments[0].slice(arguments[1], ...);

这样做的好处是我们正在创建一个快速未绑定包装器 for slice在一行中。

Edit:创建快速未绑定包装器的更好方法如下(请注意,它可能无法在某些较旧的浏览器中工作,但您现在实际上不需要担心 - 您可能总是使用shim对于不支持的浏览器bind):

var slice = Function.prototype.call.bind(Array.prototype.slice);

这与:

function slice() {
    return Function.prototype.call.apply(Array.prototype.slice, arguments);
}

怎么运行的:

  1. Function.prototype.call是一个函数。
  2. The this的指针call指着Function.prototype.
  3. We use bind改变this的指针call to Array.prototype.slice.
  4. bind返回一个函数,其arguments are applied to call.

Bonus:如果您的编程风格是高度实用的,就像我的一样,那么您会发现这段代码非常有用:

var funct = Function.prototype;
var obj = Object.prototype;
var arr = Array.prototype;

var bind = funct.bind;

var unbind = bind.bind(bind);
var call = unbind(funct.call);
var apply = unbind(funct.apply);

var classOf = call(obj.toString);
var ownPropertyOf = call(obj.hasOwnProperty);
var concatenate = call(arr.concat);
var arrayFrom = call(arr.slice);
  1. 使用此功能,您可以使用以下任一方法轻松创建未绑定的包装器call or apply.
  2. 您可以使用classOf以获得内部[[Class]]的一个值。
  3. 您可以使用ownPropertyOf在 for in 循环内。
  4. 您可以使用concatenate加入数组。
  5. 您可以使用arrayFrom创建数组。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在javascript中调用并应用[重复] 的相关文章

随机推荐

  • 在 mac 中安装 PHP INTL 不正确

    我已经安装了php56 intl using Homebrew像这样 brew install php56 intl当我这样做时php m grep intl它给了我intl 但是当我检查我的phpinfo 文件 不显示intl 不知道我错
  • 导致 JavaFX 2.0 中 TableView 不响应鼠标单击

    我想要一个 JavaFX 2 0 TableView 但我不希望它响应鼠标单击 当然 我可以禁用控件 小部件 但它会显示为禁用 tableview setSelectionModel null 给出了我想要的行为 但 UI 转储了抱怨 nu
  • 在 Flex 中的组件之间共享数据的最佳方式是什么?

    我正在为新工作开发一个 Flex 应用程序 这有点像一个训练轮应用程序 我正在学习这门语言 这不是一个需要与服务对话才能完成工作的应用程序 整个应用程序中有一些组合框实例共享相同的一组可能值 例如 选择状态 进行中 拒绝 完成 我希望它们使
  • 使用 Indy 发布并且文件名包含希腊字符时文件上传失败

    我正在尝试实施一个POST到网络服务 我需要发送一个类型为可变的文件 docx pdf txt 以及 JSON 格式的字符串 我已成功使用类似于以下的代码成功发布文件 procedure DoRequest var Http TIdHTTP
  • 使用 python xml.sax 解析 XML 实体

    使用 xml sax 使用 python 解析 XML 但我的代码无法捕获实体 为什么skippedEntity 或resolveEntity 不报告以下内容 import os import cStringIO import xml sa
  • 如何让mysql接受外部连接

    我有一个 VPS 我想让 mysql DB 接受外部连接 例如从我的电脑 我在服务器上安装了 Debian Linux 我上网查了一些教程 他们说要注释掉 bind address 127 0 0 1 但这似乎没有帮助 VPS 有什么特别的
  • 系统上未安装语音或当前安全设置中没有可用的语音

    尝试使用 SpeechSynthesizer 在 C 上创建 wav 文件时 IIS 服务器出现异常 当应用程序无法访问语音供 SpeechSynthesizer 使用时 会导致此错误 第一个可能的原因是系统上缺少任何已安装的语音 很可能这
  • yii 中 utf8 字符和 htmlspecialchars 错误

    我在 yii 中的字符编码有问题 如果我创建一个新的网络应用程序 Yii framework framework yiic webapp MyTest 然后转到 protected views layouts main php 并将页脚更改
  • Linux下C语言清除串口数据?

    我正在测试发送和接收程序 代码如下 main 函数如下 include lib h int fd int initport int fd struct termios options Get the current options for
  • C++ 变暖 std 向量

    为什么第二次填充 std vector 更快 即使从一开始就预留了空间 int total 1000000 struct BaseClass float m 16 int id BaseClass int id id id int main
  • Laravel 5.7 电子邮件验证路由

    Laravel 5 7 添加了电子邮件验证功能 但在我的项目中 我不使用默认的路由名称 而是出于自己的目的添加了前缀 现在 当我添加以下代码来添加验证路由时 它显示错误 Auth routes verify gt true 错误消息表明ve
  • Python下载文件

    我不确定该怎么做 一种方法是 import urllib request urllib request urlretrieve www example com file tar file tar 另一种方法是 import urllib r
  • 调用原生 Javascript 类型的方法,无需使用 () 包装

    在 Javascript 中 我们可以直接调用字符串文字上的方法 而无需将其括在圆括号内 但不适用于其他类型 例如数字或函 数 这是一个语法错误 但是 Javascript 词法分析器需要将这些其他类型括在圆括号中是否有原因 例如 如果我们
  • 这个承诺看起来正确吗?

    这似乎应该将数据传递到我的范围 但事实并非如此 下面的代码是否有任何直接跳出的错误 angular module Lunch services factory LunchMates q http gt LunchMates getLunch
  • 如何在 PHP 中使用 scandir 只获取图像?

    有没有办法只获取带有扩展名的图像jpeg png gif使用时等 dir tmp files1 scandir dir 您可以使用glob images glob tmp jpeg gif png GLOB BRACE 如果您需要不区分大小
  • 将 array_multisort() 与自定义函数一起使用[关闭]

    Closed 这个问题需要细节或清晰度 目前不接受答案 我有以下数组 我想根据另一个数组对其进行排序 而不是DESC or ASC array array note gt array test test1 test2 test3 test4
  • 在具有 Html 服务的站点中显示电子表格数据 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 我显示 我想做的事情与此类似tutorial但我不想使用 UI 服务来显示表格 而是想使用 HTML 服务 有人从这个question提到您可以使用
  • 不使用 try except 填充字典

    假设我有字典 并且我想用一些键和值填充它 第一个字典是空的 假设我需要这个字典作为计数器 例如计算字符串中的一些键 我有这样的方法 myDic try myDic desiredKey 1 except KeyError myDic des
  • 如何让 Apache POI 和 JAXB 协同工作?

    java lang ClassNotFoundException org apache xmlbeans XmlObject 当我运行我的代码时出现该错误 好吧 没关系 我只是忘记获取 XMLBeans 但它已经退役 我在他们的档案中找不到
  • 在javascript中调用并应用[重复]

    这个问题在这里已经有答案了 可能的重复 链调用和apply在一起是什么意思 我发现了一些这样的代码 function fun return Function prototype call apply Array prototype slic