“Function.call.bind(Function.bind)”是什么意思?

2024-02-07

我需要你的帮助。我被这些代码行困住了

var bind = Function.call.bind(Function.bind);
bind(CC, Components);

我试图理解它们是什么以及它们如何工作,但我不能:-(

  1. 有人可以帮助清楚地解释它们是如何工作的吗?正如我 理解,“Function.call.bind”将调用一个函数,该函数是 通过bind() 绑定到它。并且“Function.bind”将返回一个函数 它由“Function.call.bind”调用。也不知道如何“绑定(CC, Components)”有效。看起来组件将绑定到 CC。请 如果我错了请纠正我。
  2. 如果我不想使用那样的函数构造函数,我应该怎么做才能以另一种方式重写上面的代码,但仍然保持相同的工作流程/逻辑?

感谢您的帮助。


1. 什么是Function#bind和独立的bind功能?

Function#bind

致电Function#bind创建一个永远绑定到作为第一个参数传递的上下文的新函数。Function#bind作为函数上的方法。也就是说,您只能绑定以下功能Function#bind被调用。

let str = 'Hello, World!'
let fn = () => console.log(this)

// Bind the `this` to be `str`
let boundFn = fn.bind(str)
boundFn() // => 'Hello, World!'

// Attempt re-bind:
boundFn = fn.bind('new str')
boundFn() // => 'Hello, World!'

______

Function#call

Function#call不同于Function#bind在那它executes具有上下文和给定任何其他参数的给定函数。它不返回新的绑定函数。

let str = 'Hello, '
let fn = (who) => console.log(this + who)
fn.call(str, 'World!') // => 'Hello, World!'

______

通过引用传递函数会丢失其上下文

当我们通过引用传递函数时,我们会失去它的上下文。在这种情况下,这意味着我们不能简单地做var bind = Function.bind并打电话bind作为一个独立的功能。

let log = () => console.log('Hello, World!')
let bind = Function.bind;    
bind(log) // => Uncaught TypeError: Bind must be called on a function

______

创建独立函数bind

您共享的代码创建了一个简写(独立)函数,相当于Function#bind但接受要绑定的函数作为其第一个参数以及将该函数绑定到的上下文作为其第二个参数,而不是调用bind方法作为被绑定函数的成员(例如fn.bind(ctx)).

// Create standalone `bind` function
let bind = Function.call.bind(Function.bind);

let obj = { hello: 'World!' }
let log = () => console.log(this)
let boundFn = bind(log, obj)
boundFn() // => { hello: 'World!' }

______

2.如何实现这个功能而不需要Function#bind?

上述解决方案接受一个函数和第二个参数,该参数定义返回函数的上下文(this)。我们可以使用辅助函数非常简单地模仿此功能,该函数接受相同类型的参数并返回一个函数,该函数在调用时使用给定的上下文和参数执行该函数Function#call.

  1. 要绑定的函数
  2. 将函数绑定到的上下文

例如:

function bind (fn, ctx) {
    return function (...args) {
        fn.call(ctx, ...args);
    };
}

请注意,这与创建绑定函数并不完全相同。你可以了解创建绑定函数期间发生的情况9.4.1.3 BoundFunctionCreate在规范中 https://www.ecma-international.org/ecma-262/6.0/#sec-boundfunctioncreate.

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

“Function.call.bind(Function.bind)”是什么意思? 的相关文章

随机推荐

  • Java 用空格分隔字符串,不使用 [ ] 括号括起来

    如果字符串没有被这种括号 包围 如何用空格分割字符串 所以字符串 book new interesting book buy it 应该分为 book new interesting book buy it or book new inte
  • 为什么 scalatest MockitoSugar 被弃用?

    我是在 Scala 中编写 junit 测试的新手 我正在使用 Mockito 来模拟对象 我也在用scalatest 2 12 3 0 4 ScalaTest 文档 例如here http www scalatest org user g
  • 如何解决 Firefox 和 Chrome 之间的 CSS 填充问题?

    已经在这几个小时了 我一直在使用这个优秀的 UI 工具包 http getuikit com http getuikit com到目前为止 一切都很棒 问题是在 Chrome 和 Firefox 之间设置我的结果样式 我设置了填充并在 Ch
  • 如何避免类图中的循环关系

    Hi I have a question about some circular relationships that I am facing with my database design I read a few more simila
  • 在 VS 2012 中保存/导出单元测试结果

    如何在 VS 2012 中导出单元测试结果 我知道从来没有直接的方法可以做到这一点 尽管应该有 但至少在 2012 年我能够保存测试结果窗口中的结果 并使用 trx2html 将它们转换为可读的内容 在 2012 年 我没有看到测试资源管理
  • Azure Databricks 和表单识别器 - 图像无效或受密码保护

    我正在尝试使用 Databricks 自动化 Azure 表单识别器流程 我会将 pdf 或 jpg 文件放入 blob 中 并在 Databricks 中运行代码 将文件发送到表单识别器 执行数据识别并将结果放入 blob 中的新 csv
  • 如何防止网站检测到 Fiddler

    问题标题可能没有涵盖整个主题 因为我做了很多研究并发现了许多奇怪的事情 因此 首先 我想要实现的是某种代表用户工作的网站客户端 不做任何非法的事情 只是优化用户的一些工作流程 我已经为很多网站这样做过 效果很好 然而 目前的情况存在一个问题
  • 如何选择 HTML5 画布形状?

    我有一个 HTML5 画布 在上面绘制了几个形状 我想要发生的是 当鼠标单击任何形状时 应该选择该形状 至少它可以告诉选择了哪种形状 谢谢 尝试使用现有的画布库 或创建您自己的 该库在选择形状时会发生事件 下面的示例使用动力学 JS 库 h
  • Backbone.js 和 Require.js:不匹配的匿名 Define() 模块:function (_, Backbone) {

    我刚开始使用 require js 并且将以下 app js 文件作为我的主干应用程序的一部分 require config baseUrl js paths jquery libs jquery 2 1 0 underscore libs
  • Keras ConvLSTM2D:输出层上的 ValueError

    我正在尝试训练 2D 卷积 LSTM 以根据视频数据进行分类预测 然而 我的输出层似乎遇到了问题 ValueError 检查目标时出错 预期dense 1 有 5 个维度 但得到了形状为 1 1939 9 的数组 我当前的模型基于ConvL
  • 在 C# 中接受浮点不准确有什么好处

    我一直在想这个问题last https stackoverflow com questions 4598416 fourier transform rounding error few https stackoverflow com que
  • 当我有 hive-site.xml 时,hive shell 无法打开

    我已经在我的VM播放器中安装了ubuntu 14和hadoop 2 6 0以及Hive 0 14 0 在我的 Hive conf 中没有 Hive site xml 所以我创建了一个新文件 但是当我打开 Hive shell 时出现错误 如
  • knitr kable (Sweave) 中的 LaTeX 数学表达式

    是否可能以及如何在 knit Sweave 报告中使用 LaTeX 数学表达式kable 在下面的例子中 x 2 被呈现为 原样 With xtable 对于下面的示例 我将使用该选项sanitize colnames function f
  • 创建指向非静态类成员函数的类成员指针函数变量

    目标是拥有成员变量 AddValue指向CreateFirstValue类初始化时和第一次调用后的函数AddValue 所有未来对它的调用都将调用CreateAnotherValue 以前 我只有一个AddValue带有条件检查的函数以确定
  • Android 中的 Fling 手势和 Webview

    我有一个 webview 控件 需要支持 Android 中的 fling 手势 以便调出新记录 加载新数据 这是在扩展 Activity 的类中发生的 我见过的所有示例都展示了如何实现对文本视图的手势支持 但没有展示对网络视图的手势支持
  • 使用()创建对象与不使用()创建对象的区别

    我刚刚遇到问题 error request for member show in myWindow which is of non class type MainGUIWindow 当尝试编译一个简单的 qt 应用程序时 include
  • 忽略 New Relic 中的持久 SignalR 连接

    我应该打电话到哪里NewRelic Api Agent NewRelic IgnoreApdex or NewRelic Api Agent NewRelic IgnoreTransaction 在我的 SignalR 集线器中以防止长时间
  • DataGrid 内 ComboBox 上的 ItemSsource 绑定

    DataGrid 内的组合框未填充列表 我认为 ItemSource Path 有问题 查看 DataGrid 的 xaml 代码
  • MVC 4 Razor 文件上传

    我是 MVC 4 的新手 我正在尝试在中实现文件上传控制 我的网站 我无法找到错误 我得到的是空值 我的文件中的值 控制器 public class UploadController BaseController public Action
  • “Function.call.bind(Function.bind)”是什么意思?

    我需要你的帮助 我被这些代码行困住了 var bind Function call bind Function bind bind CC Components 我试图理解它们是什么以及它们如何工作 但我不能 有人可以帮助清楚地解释它们是如何