我写了这样的话:
window.onload = function() {
var a = new A();
a.init();
};
A = function() {
this.b = {};
};
A.prototype = {
init : function() {
document.writeln("init");
this.b = new B();
this.b.doCallback(this.init2);
},
init2 : function() {
document.writeln("init2");
this.b.say();
}
};
B = function(){};
B.prototype = {
doCallback: function(callback){
callback();
},
say: function(){
document.writeln("I'm B");
}
};
对我来说输出应该如下所示:
init
init2
I'm B
但是,它看起来像是这样:
init
init2
Chrome说方法“说”未定义。有人能解释我为什么吗?
答案 0 :(得分:2)
这是因为在您的代码中this
不代表B的实例。
一个函数的关键字在JavaScript中的行为略有不同 与其他语言相比。它之间也有一些差异 严格模式和非严格模式。一般来说,对象绑定到此 在当前范围内由当前功能如何确定 在执行期间,它不能通过赋值来设置,它可以是 每次调用函数时都不同。 ES5引入了绑定 无论如何调用函数,都可以修复函数。
https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/this
因此,当您致电callback
init2
时,this.b
为null
并且没有任何say
方法。
如果您使用的是jQuery,则可以使用方法proxy http://api.jquery.com/jQuery.proxy/
this.b.doCallback(jQuery.proxy(this.init2,this));