检查此代码
var _class=function()
{
this.Test=100;
this.Callback=function(msg)
{
alert(msg+"\r\n"+this.Test);
}
}
function run(call)
{
call("Hello world");
}
var obj=new _class();
run(obj.Callback);
我得到了结果:
[Alert]
Hello world
undefined
但是当我打电话的时候 obj.Callback(“Hello world”)
我得到了预期
[Alert]
Hello world
100
为什么?
感谢您的帮助
答案 0 :(得分:6)
对象与“内部”定义的函数之间没有内在关系。在函数调用中确定this
(称为“接收”对象)值的唯一事物是调用函数的方式。
object.func()
调用某个函数,this
将绑定到object
。this
由第一个参数决定。this
将不会引用window
(或无论全局背景如何)。诀窍在于,当你想要使用一个函数就好像它是一个对象上的“方法”时,即使函数引用已经从对象中拉出来,关系仍保持不变,你可以预先绑定this
有两种方式:
this
。第一种方式如下:
run(function() { obj.Callback(); });
第二种方式如下:
run(obj.Callback.bind(obj));
在这方面,JavaScript与C#或Java等语言截然不同。在这些语言中,函数永远处于与其类(或其类的实例)的关系中。不是JavaScript;实际上,它确实无关紧要,其中定义了一个函数。如果它是这样编写的,那么你的“_class”函数将是等效的:
function helloThere() {
alert(msg + "\r\n" + this.Test);
}
var _class = function() {
this.Test = 100;
this.Callback = helloThere;
};
编辑 - @jamietre正确地注意到你的“_class”函数包含一些var
声明或本地函数,那么肯定会有区别(尽管不是关于方式this
在调用“回调”时表现。)
再次编辑 - 谢谢@Koolinc
答案 1 :(得分:1)
this.Test未定义。该上下文中的范围是回调函数。
这是一个快速修复:
var _class=function()
{
var self = this;
this.Test=100;
this.Callback=function(msg)
{
console.log(msg+"\r\n"+self.Test);
}
}