gpt4 book ai didi

javascript - 使用 Javascript Bind 立即调用方法

转载 作者:行者123 更新时间:2023-11-28 06:07:28 24 4
gpt4 key购买 nike

我正在学习 Bind、Call 和 Apply,我有一个关于 Bind 的问题,但尚未找到好的答案:

假设我有以下代码

var Jim = {
firstName: 'Jim',
lastName: 'Bob',
fullName: function() {
return this.firstName + ' ' + this.lastName;
}
};

var fName = Jim.fullName; //now fName's context is window

//If I invoke fName here, I will get the expected 'undefined undefined'
console.log(fName());

但是,我也可以执行以下操作并让我的绑定(bind)方法在传递新上下文后立即调用:

fName.bind(Jim)(); //this returns 'Jim Bob'

我觉得这只是模仿可以(应该?)使用 callapply 完成的事情。如果我在上一行之后再次调用 fName(),它仍然绑定(bind)到窗口对象(fName 没有通过就地使用绑定(bind)进行修改)。这是不好的做法吗?

这个怎么样:

var Jim = {
//same object definition as above
};

var Chris = {
firstName: 'Chris',
lastName: 'Smith'
};

var fName = Jim.fullName.bind(Jim); //now fName's context is the Jim object
console.log(fName()); //this will log 'Jim Bob' as expected

现在,如果我尝试将绑定(bind)方法绑定(bind)到另一个上下文,它就不起作用:

fName.bind(Chris)(); //this still logs 'Jim Bob' from the original context

我相信在第二种情况下,这是因为我基本上是在创建一个“函数绑定(bind)绑定(bind)”,所以它有两个上下文,只适用于第一个。

对这两种情况有什么想法吗?

最佳答案

你基本上在所有方面都是正确的。正在做

var fName = Jim.fullName;
fName.bind(Jim)();

完全相同
var fName = Jim.fullName;
fName.call(Jim);

我不确定是否会将第一个示例称为“不好的做法”,但它绝对不是“好的做法”。 call 完全按照您想要的方式执行,而无需生成新的函数值,并且(在我看来)可以更好地描述您的意图。

至于为什么你不能重新绑定(bind)函数,你非常接近正确的。 fName 并不是有两个上下文,它仍然只有一个。但是 bind 明确指出“这是这个函数的上下文,毫无疑问。”

关于javascript - 使用 Javascript Bind 立即调用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36705472/

24 4 0
文章推荐: javascript -
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com