1

我写了这样的东西:

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 说方法“说”是未定义的。有人可以解释我为什么吗?

4

1 回答 1

2

这是因为在您的代码this中不代表 B 的实例。

与其他语言相比,函数的 this 关键字在 JavaScript 中的行为略有不同。严格模式和非严格模式也有一些区别。一般情况下,当前作用域绑定到 this 的对象是由当前函数的调用方式决定的,不能在执行时通过赋值来设置,每次调用函数时都可以不同。ES5 引入了 bind 方法来修复函数的 this,不管它是如何被调用的。

https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/this

因此,当您调用callbackwhich is init2this.bisnull并且没有任何say方法时。

如果您使用的是 jQuery,您可以使用方法代理http://api.jquery.com/jQuery.proxy/

this.b.doCallback(jQuery.proxy(this.init2,this));
于 2012-10-22T13:52:02.720 回答