これはおそらく、Javascript を初めて使用する人にとって典型的な質問です。同様の質問をいくつか調査しましたが、私が見ている動作を説明できませんでした。
以下のコードは、私がやろうとしていることを示しているはずです。MyObjectA と MyObjectB の 2 つのオブジェクトがあります。
MyObjectB には、echo
単にメッセージをログに記録するメソッドがあります。this.name
誰がメソッドを実行しているかを知るために、メッセージの前にを付けます。の値も出力しますthis
。
MyObjectA には、callAFunctionWithMessage
まさにそれを行うメソッドが呼び出されています。メッセージと関数を受け取り、それを呼び出します。
グローバル スコープでは、オブジェクトがインスタンス化されて呼び出されます。私が見るものはthis.name
ですundefined
。そして、ブラウザで実行するとthis
価値がありDOMWindowObject
、nodejsで実行すると大規模なインフラストラクチャのようなオブジェクトがありました。誰かがこの行動についての洞察を手伝ってくれますか? MyObjectA がエコーを呼び出していることを考えると、'this' が MyObjectA を指すと予想していました。
また、予想どおり、MyObjectB.echo('hello')
どこthis
が MyObjectB を指すかを実行します。
function MyObjectA(name) {
this.name=name;
}
MyObjectA.prototype = {
name : "",
callAFunctionWithMessage: function (msg, callback) {
callback(msg);
}
}
function MyObjectB(name) {
this.name = name;
}
MyObjectB.prototype = {
name :"",
echo: function(msg) {
var messageToPrint='[from '+this.name+']'+msg;
console.log(messageToPrint, " : " + this);
}
}
var a = new MyObjectA("ObjA");
var b = new MyObjectB("objB");
a.callAFunctionWithMessage('hello from A!', b.echo);
// => [from result]hello from A! : [object Window]
b.echo('hello!');
// => [from objB]hello! : [object Object]