Javascript失败(这个。*指示错误),为什么
在对象内创建指向函数的指针时 “此”未正确解决Javascript失败(这个。*指示错误),为什么,javascript,oop,conceptual,Javascript,Oop,Conceptual,在对象内创建指向函数的指针时 “此”未正确解决 请尝试此示例以获取概念 // this.* fail a = { x : 123, f : function(){ console.log( this.x ) } } a.f() // 123 b = a.f // b points to a.f now b() // should print 123 but gaves 'undefined' 当然,我们可以使用对象名而不是“this”强制解析 但是我们失去了函数性
请尝试此示例以获取概念
// this.* fail
a = { x : 123, f : function(){ console.log( this.x ) } }
a.f() // 123
b = a.f // b points to a.f now
b() // should print 123 but gaves 'undefined'
- 当然,我们可以使用对象名而不是“this”强制解析
但是我们失去了函数性李>
a.f()
时,f
方法中的this
关键字是对a
的引用)
但是,当您在变量中保留对函数的引用时,在调用它时,实际上会丢失上下文,因此此
将成为全局上下文(在浏览器中是窗口
)
因此,在调用函数时,需要通过call
或apply
方法为函数提供上下文:
您的代码变成:
b = a.f;
b.call(a); // or b.apply(a)
从
功能上下文
在函数内部,其值取决于函数的运行方式
打电话来
简单通话
function f1(){
return this;
}
f1() === window; // global object
这就是您在第二种情况下所做的b()
。您基本上是在全局对象上调用x。所以
var x = 456;
// this.* fail
a = { x : 123, f : function(){ console.log( this.x ) } }
a.f() // 123
b = a.f // b points to a.f now
b() // prints 456
作为对象方法 当函数作为对象的方法调用时,它的this设置为 调用该方法的对象 在下面的示例中,当调用o.f()时,在函数内部 这是绑定到o对象的
var o = {
prop: 37,
f: function() {
return this.prop;
}
};
console.log(o.f()); // logs 37
这是第一种情况下发生的情况。您可以使用
bind
:
b = a.f.bind(a);
b(); // 123
发件人:
bind()方法创建一个新函数,当调用该函数时,
将其this关键字设置为给定的值,并具有给定的序列
调用新函数时,在任何参数之前提供的参数
您可以尝试将其分配给对象中的某个变量:
var a = {
x : 1,
self : this,
f : function() {
self.x++;
},
show : function() {
alert(self.x);
}
}
a.f();
a.show();
d = a.show;
d();
拨弄或使用
bind
这完全取决于函数的调用方式,也不一定是全局上下文。