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は、メソッド「say」は未定義であると言っています。誰かが私に理由を説明できますか?

4

1 に答える 1

2

これは、コード内thisでBのインスタンスを表していないためです。

関数のthisキーワードは、JavaScriptでは他の言語とは少し異なる動作をします。また、厳密モードと非厳密モードにはいくつかの違いがあります。一般に、現在のスコープでこれにバインドされるオブジェクトは、現在の関数がどのように呼び出されたかによって決定され、実行中の割り当てによって設定することはできず、関数が呼び出されるたびに異なる可能性があります。ES5では、関数の呼び出し方法に関係なく、関数のthisを修正するbindメソッドが導入されました。

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

したがって、callbackwhich is init2this.bis 、noを呼び出している場合、メソッドはnullありませんsay

jQueryを使用している場合は、メソッドプロキシhttp://api.jquery.com/jQuery.proxy/を使用できます。

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