将方法分配给变量和问题
Assigning method to variable and problems with this
我有这段代码:
function A(){
this.count = 0;
}
A.prototype.inc = function(){
this.count++;
}
var a = new A();
a.inc();
var f = a.inc;
f();
最后一行无法按我的预期工作,因为this
是 Window
类型的对象。这只是你不应该做的事情 - 将方法分配给变量,以防它们使用this
?
当我想使用方法作为参数时,我是否应该省略fn(a.inc)
,我将用于常规函数,而是使用以下方法?
fn(function(){
a.inc();
});
这是JavaScript中著名的"丢失绑定"。
你必须做:
f = a.inc.bind(a);
因为如果你说
f = a.inc;
f();
然后当f
运行时,this
不绑定到a
。 它绑定到全局对象,该对象window
。
规则是,如果你说a.fn()
,那么在函数内部,this
绑定到a
,但如果你只是说fn()
或g()
,即使g === a.fn
,那么在函数内部,this
绑定到全局对象,这是window
。
若要在调用函数时将this
显式绑定到a
,必须使用 a.inc.bind(a)
如果您不想使用bind
但想使用自己的函数,那也没关系。 你会做:
function fn() {
a.inc();
}
或其他形式:
var fn = function() {
a.inc();
};
这样,fn
是一个捕获上下文的闭包,并且能够使用 a
,它在作用域链中的某个作用域中。
在JavaScript中,"方法"并没有真正绑定到对象。它只是一个存储在属性中的函数。当您使用点表示法调用它时,会发生this
的绑定,因此,如果将该方法分配给变量,则它不起作用。
上有一个名为 bind
的方便内置方法,允许您将this
永久绑定到值。如果这样做:
var f = a.inc.bind(a);
你会得到你想要的行为。
使用内联函数也可以工作,因为它捕获a
,并且您仍然使用点表示法来调用该方法,该方法会正确地将this
绑定到对象。
相关文章:
- 将PHP变量传递给jQuery时遇到问题
- 参数变量出现ngTable指令问题
- 为变量分配多个nodejs导出返回值时出现问题
- 如何处理流星变量&对miniMongo有问题
- Jquery变量类型问题
- 带有.css()串联问题的jQuery变量
- JavaScript变量引用数组时出现问题
- 将一个php变量从js传递到php,并返回内容问题
- 简单的变量问题
- 可以't在quizz页面范围问题上用最终分数更新变量
- array_push平面数组问题-需要能够向数组中添加多个变量
- 尝试将变量传递到对象中时的作用域问题'的方法构造函数
- Javascript函数变量传递语法问题
- 访问带有变量的Object元素时出现问题
- 将 Ajax 数据分配给全局变量时出现问题
- JavaScript/jQuery中的基本数学问题-变量记忆值
- 简单的jQuery变量问题-变量冲突
- Javascript作用域问题:变量未被识别
- Javascript作用域问题-变量未定义
- 目标转换问题-变量修改