私は初めてストリクトモードで作業していますが、何と言っても、非ストリクトモードプロパティを使用できるのは年齢で初めてです。ここでの私の質問は、私が抱えている正確な問題の概要を示していますが、arguments.calleeにアクセスできる場合は、解決策をよりスケーラブルなものに適合させることができます。
関数に名前を付けずに、現在スコープ内にある関数への参照を取得できる厳密モードの方法はありますか?
私は初めてストリクトモードで作業していますが、何と言っても、非ストリクトモードプロパティを使用できるのは年齢で初めてです。ここでの私の質問は、私が抱えている正確な問題の概要を示していますが、arguments.calleeにアクセスできる場合は、解決策をよりスケーラブルなものに適合させることができます。
関数に名前を付けずに、現在スコープ内にある関数への参照を取得できる厳密モードの方法はありますか?
関数に名前を付けずに、現在スコープ内にある関数への参照を取得できる厳密モードの方法はありますか?
この回答が最初に書かれた2012年には、リンクされたソリューションで使用していた名前付き関数式に実装のバグがありました。これらのバグのあるブラウザがまだかなり流通してから何年も経ちました。したがって、ここ(非常に)ポストIE8の世界では、名前付き関数式のアプローチは問題ありません。
UsageGraph = Graph.extend({
generateScale: function GS() {
var parentMethod = this.constructor._super.generateScale;
if(parentMethod === GS) {
parentMethod = this.constructor._super.constructor._super.generateScale;
}
parentMethod.call(this); // run the parent's method
//do additional stuff
}
});
しかし、質問はあなたが名前を持つことを避けることができるかどうか尋ねます。2012年に、関数に名前を付けたくない場合の私の解決策は、匿名関数を変数に割り当てることでした。
UsageGraph = Graph.extend(function(){
var GS = function() {
var parentMethod = this.constructor._super.generateScale;
if(parentMethod === GS) {
parentMethod = this.constructor._super.constructor._super.generateScale;
}
parentMethod.call(this); // run the parent's method
//do additional stuff
};
return {generateScale: GS};
}());
しかし、それはもう機能しません。ES2015以降、その関数にも、割り当てられている変数の名前から推測される名前があります。
var GS = function() { };
console.log(GS.name); // "GS"
本当に名前を付けたくない場合は、それを回避することは可能ですが、たとえば、関数を別の関数の戻り値にするなど、仕様で定義されている自動命名を無効にするように努力する必要があります。
var GS = (() => function() { })();
console.log(GS.name); // ""
したがって、名前を避けることが重要な場合は、次のようにします。
UsageGraph = Graph.extend(function(){
const generateScale = (() => function() {
let parentMethod = this.constructor._super.generateScale;
if(parentMethod === generateScale) {
parentMethod = this.constructor._super.constructor._super.generateScale;
}
parentMethod.call(this); // run the parent's method
//do additional stuff
})();
return {generateScale};
}());
はい、しかしいいえ...これがあなたが話しているのと同じ「命名」の方法であるかどうかはわかりません。
var foo = function bob() {
// call bob();
}
// bob is undeclared; here it's foo!