次の JavaScript があります。
function b() {
alert(arguments.caller[0]);
}
function X(x) {
this.x = x;
}
X.prototype.a = function(i) {
b();
}
new X(10).a(5);
これにより、メッセージ「5」が表示されます。ただし、「10」を表示したい、つまり関数 b で呼び出し元の「this」プロパティにアクセスしたい。これは可能ですか?
次の JavaScript があります。
function b() {
alert(arguments.caller[0]);
}
function X(x) {
this.x = x;
}
X.prototype.a = function(i) {
b();
}
new X(10).a(5);
これにより、メッセージ「5」が表示されます。ただし、「10」を表示したい、つまり関数 b で呼び出し元の「this」プロパティにアクセスしたい。これは可能ですか?
呼び出し元を引数として関数に渡すことができます。
function b(caller) {
alert(caller.x);
};
function X(x) {
this.x = x;
};
X.prototype.a = function(i) {
b(this);
};
new X(10).a(5);
arguments.caller は JS 1.3 で廃止され、JS 1.5 で削除されていることに注意してください。
function b() {
alert(this.x);
}
function X(x) {
this.x = x;
}
X.prototype.a = function(i) {
b.call(this); /* <- call() used to specify context */
}
new X(10).a(5);
関数 b の呼び出しを無名関数内にラップすることで、間接的なレベルを導入しています。可能であれば、直接設定する必要があります。
function b() {
alert(this.x); // 10
alert(arguments[0]); // 5
}
function X(x) {
this.x = x; /* alternatively, set this.x = arguments to capture all arguments*/
}
X.prototype.a = b;
new X(10).a(5);
それ以外の場合は、オブジェクトを渡す必要があります。これは、JP または balpha が提案した方法のいずれかで行うことができます。