私はJavaScriptで関数を実行していることを確認する必要があります。実際には正しい関数です(例:呼び出すには関数something.stuff.morestuff.coolFunction
が必要です。 私はFunction.caller
を取得しようとしましたが、これは関数自体を返すだけで、内部にあるオブジェクトを特定する方法はありません。Javascript呼び出し元関数の親子
function helloWorld(){
if(/* the exact path to the calling function */ === 'greetings.happy.classic.sayhello'){
console.log('Hello World');
}else{
console.log(/* the path from earlier */ + ' not allowed.');
}
}
greetings = {
happy: {
classic: {
sayHello: function(){ helloWorld(); }
sayBye: function(){ helloWorld(); }
}
},
angry: {
sayHello: function(){ helloWorld(); }
},
simple: [
function(){ helloWorld(); }
]
}
function sayWords(){
helloWorld();
}
私が達成しようとしている何を次のようになります:次のセットアップが考える
greetings.happy.classic.sayHello(); // => Hello World!
greetings.happy.classic.sayBye(); // => greetings.happy.classic.sayBye not allowed.
greetings.angry.sayHello(); // => greetings.angry.sayHello not allowed.
greetings.simple[0](); // => greetings.simple[0] not allowed.
sayWords(); // => sayWords not allowed.
helloWorld(); // => null not allowed.
// not sure what would come out of this, so i put null on that one
は、ここに1つの小ぎれいなパッケージでの質問です:
呼び出し元関数の正確なオブジェクトパス(すなわち
greeting.happy.classic.sayHello
)をどのように見つけることができますか?Function.caller.name
は関数の名前を返すだけで十分ではありません。呼び出し関数の場所の完全なツリーが必要です。
これは複雑な問題のように感じます。ご協力いただきありがとうございます。
...プリプロセッサ/ uglyfier /バンドラは、あなたのアプローチを破る可能性が高い以上であることを認識しております。ネストされた両親のそれを超えて、私はあなたがそれを行うことができるとは思わないし、私はそれが必要だとは思わない。関数を呼び出すかどうかの決定段階が下流に置かれないように、または関数が何をすべきかを決定するために引数を渡すことを試みるように、アルゴリズムを配線することができます。私はかなりあなたがそれを達成するための方法のトンを見つけることができると確信しています。 – Redu
関数で 'this'を使うと、別の関数で呼ばれたとしても、呼び出し元の' this'スコープにはアクセスしません。関数自体の 'this'スコープだけです。 'this'は、関数を呼び出す関数ではなく、関数が存在するオブジェクトを参照します。 – MineAndCraft12