JSON で記述されたコードを解釈する JavaScript VMに対する私自身の回答で、JavaScript クロージャーの「パブリック」プロパティには「プライベート」関数ではアクセスできないと述べました。
その投稿で与えられた例は
function anobject(){
var privatefunction = function(){
//publicfunction(); //wrong; you have no access to it
console.log(this); //refer to the global object, not the object creating
};
this.publicfunction = function(){
console.log(this); //refer to the object creating
}
}
privatefunction
その理由は、下位互換性の問題がグローバルオブジェクトに属している必要があるためだと思います。したがって、パブリック関数は、のプロパティに割り当てられた無名関数にすぎませんthis
。publicfunction
これは、最初への参照が必要なため、呼び出しが失敗する理由を説明していますthis
。
ただし、次の修正はまだ機能しません。
function anobject(){
var privatefunction = function(){
//publicfunction(); //wrong; you have no access to it
console.log(this); //refer to the object creating
}.bind(this);
this.publicfunction = function(){
console.log(this); //refer to the object creating
}
}
privatefunction
オブジェクトの作成にバインドする必要があることを明示的に指定しているため、呼び出しpublicfunction
は機能するはずですが、機能しません。私は次のことをしなければなりません:
function anobject(){
var privatefunction = function(){
this.publicfunction();
console.log(this); //refer to the object creating
}.bind(this);
this.publicfunction = function(){
console.log(this); //refer to the object creating
}
}
別の回避策(私が使用している方法)は次のとおりです。
function anobject(){
var privatefunction = function(){
publicfunction();
console.log(this); //refer to the object creating
};
var publicfunction = function(){
console.log(this); //refer to the object creating
}
this.publicfunction = publicfunction;
}
では質問部分です。この動作の背後にある理由は何ですか? this
accessのプロパティを明示的に指定せずに無効にすることで、何を回避しようとしていますか?
更新: 質問の主な部分は次のとおりです: インタープリターがスコープチェーンで名前を見つけられない場合、なぜプロパティを調べるべきではないのthis
ですか?