私にとってスコープの制限であることが証明されていることを回避するために(ここで回答)、無名関数に行を挿入するコードを作成しました。これにより、関数を作成する人は誰でも自分でそれを行う必要がなくなります。それは少しハッキーです(実際には、かなりハッキーな感じがします)、そして私は本当に自分が何をしているのかわからないので、私が見逃したかもしれないエラーを見つけたり、危険を指摘したりするために専門家の目で感謝します気づいていません。コードは次のとおりです。
function myObj(testFunc) {
this.testFunc = testFunc;
this.Foo = function Foo(test) {
this.test = test;
this.saySomething = function(text) {
alert(text);
};
};
var Foo = this.Foo;
var funcSep = this.testFunc.toString().split("{");
funcSep.splice(0, 1);
funcSep = funcSep.join("{");
var compFunc = " var Foo = this.Foo;" + funcSep;
compFunc = compFunc.split("}");
compFunc.splice(compFunc.length - 1, 1);
compFunc.join("}");
var otherTestFunc = new Function(compFunc);
otherTestFunc.apply(this);
}
var test = new myObj(function() {
var test = new Foo();
test.saySomething("Hello world");
});
上記の関数は期待どおりに評価され、匿名関数を作成する人にFoo
、を使用してアクセスを取得するように強制する必要はありませんthis.Foo
。ただし、このアプローチは不愉快に感じます。私がしていることは受け入れられますか?そうでない場合、それを回避する方法はありますか?
また、これを元の質問に含めなかった唯一の理由は、質問の元のコンテキストからの逸脱のように見えることです。