使用Javascript绑定立即调用方法
Immediately Invoking Methods with Javascript Bind
我正在学习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());
然而,我也可以执行以下操作,并在传递新上下文后立即调用绑定方法:
fName.bind(Jim)(); //this returns 'Jim Bob'
我觉得这只是在模仿call
或apply
可以(应该)做什么。如果我在上一行之后再次调用fName()
,它仍然绑定到窗口对象(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
现在,如果我试图将绑定的方法绑定到另一个上下文,它是不起作用的:
fName.bind(Chris)(); //this still logs 'Jim Bob' from the original context
我相信在第二种情况下,这是因为我基本上是在创建一个"函数绑定边界",所以它有两个上下文,只适用于第一个上下文。
对这两个案子有什么想法吗?
你基本上是对的。进行
var fName = Jim.fullName;
fName.bind(Jim)();
和完全一样吗
var fName = Jim.fullName;
fName.call(Jim);
我不确定我会把第一个例子称为"坏做法",但它绝对不是"好做法"。call
在不生成新函数值的情况下完全按照您的意愿执行,并且(在我看来)更好地描述了您的意图。
至于为什么你们不能重新绑定一个函数,你们是非常接近正确的。与其说fName
有两个上下文,不如说它仍然只有一个上下文。但bind
明确表示"这是该函数的上下文,毫无疑问。"
您不再像以前那样绑定到相同的fName函数。bind
返回一个新的绑定函数,其this
值不能被重写。
根据MDN文件,
bind()函数创建了一个新函数(绑定函数),该函数具有与其被调用的函数(绑定函数的目标函数)相同的函数体(ECMAScript 5术语中的内部调用属性),该值绑定到bind(。
相关文章:
- 未捕获错误:无法在初始化之前调用方法;
- 通过ajax从客户端调用C#方法来执行C#方法
- 如何避免在angular上多次调用方法;s ng重复
- React路由器错误-'无法调用方法'getRouteAtDepth'的未定义'
- 从window.onbeforeunload调用方法背后的代码
- 当输入字段为空时,如何在angular中调用方法
- 函数调用方法有什么用
- 多次调用方法后返回相同promise的模式
- 当从Chrome扩展动态注入JS时,从onload()内部调用方法
- 茉莉花 - 未调用方法
- jQuery如何在原型中调用方法
- ng显示“;调用方法“;不起作用
- Odoo销售点如何访问模型并使用JS调用方法
- 从React调用方法.JS州
- TinyMCE验证给出错误:无法调用方法'getContent'的未定义
- 向模板实例变量传递调用方法调用的结果时出现异常
- 如何在对象中调用方法
- 检查对话框是否为 Open 会引发“初始化前无法在对话框上调用方法”错误
- 在输入类型提交按钮上调用 C# 方法
- 通过类选择器单独调用方法