首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >"Function.call.bind(Function.bind)“是什么意思?

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

Stack Overflow用户
提问于 2015-10-19 15:12:19
回答 2查看 368关注 0票数 5

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

代码语言:javascript
复制
var bind = Function.call.bind(Function.bind);
bind(CC, Components);

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

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

谢谢你的帮助。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-10-19 15:35:42

1. Function#bind和独立的bind函数是什么?

Function#bind

Function#bind的调用将创建一个新函数,该函数将永久绑定到作为第一个参数传递的上下文。Function#bind作为函数的一个方法进行操作。也就是说,您只能绑定调用Function#bind的函数。

代码语言:javascript
复制
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,因为它使用给定的上下文和任何其他参数执行给定函数的。它不返回新的绑定函数。

代码语言:javascript
复制
let str = 'Hello, '
let fn = (who) => console.log(this + who)
fn.call(str, 'World!') // => 'Hello, World!'

______

通过引用传递函数将失去其上下文。

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

代码语言:javascript
复制
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))。

代码语言:javascript
复制
// 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. 将函数绑定到的上下文。

例如:

代码语言:javascript
复制
function bind (fn, ctx) {
    return function (...args) {
        fn.call(ctx, ...args);
    };
}

请注意,这与创建绑定函数并不完全相同。你可以 in the spec

票数 3
EN

Stack Overflow用户

发布于 2015-10-19 15:16:57

  1. 函数的上下文取决于函数的调用方式,因此,为了使简写的bind正确工作,您必须生成一个函数,其中thisFunction.bind。注意call的签名: .call(thisArg[,arg1[,arg2,.]) 因此,此执行返回绑定到Function.bind的函数。在您的具体情况下,它将CC绑定到Components,因此当您调用CC()时,上下文(this)将是Components
  2. Per @BenjaminGruenbaum你可以做let bind = (fn, ...args) => fn.bind(...args);
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33217983

复制
相关文章

相似问题

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