2016-10-14 6 views
0

この流星コードは、IIFEのプライベートメソッドとしてprintFuncNameを持っています。それは公共のメソッドから呼び出されると、それはエラーを与える:印刷機能名IIFEのプライベートメソッド

TypeError: Cannot read property 'name' of null

なぜそれがこれをやっているし、それはから呼び出されている関数名を出力するようにどのようにそれを固定することができますか?おかげ

funcObj = (function() { 

    const printFuncName = (str) => { 
    const info = str ? ' ' + str + ' ' : ' '; 
    console.log(arguments.callee.caller.name + info); //<---- Error line 
    }; 

    return { 
    myPub:() => { 
     printFunctionName('info'); 
    } 

    } 

}()); 
+0

発信者を参照する標準的な方法はありません。 – Oriol

+0

@Oriolそして、代わりの解決策は何ですか? –

+0

解決策はありません。なぜあなたは発信者が必要ですか? – Oriol

答えて

0

printFuncNameの発信者にアクセスすると仮定すると、問題は矢印機能なので、argumentsというバインディングはありません。あなたはIIFEのargumentsにアクセスしています。

とにかく、arguments.calleeは絶対に使用しないでください。それは標準ではありませんし、あなただけの機能を参照することができます。

(function() { 
 
    const printFuncName = (str) => { 
 
    const info = str ? ' ' + str + ' ' : ' '; 
 
    console.log(printFuncName.caller.name + info); // "myPub info " (maybe) 
 
    }; 
 
    return { 
 
    myPub() { 
 
     printFuncName('info'); 
 
    } 
 
    } 
 
}()).myPub();

callerも標準ではありません注意してください。これは使用しないでください。それに頼らないでください。それは厳密なモードでスローされます。汚いモードでは動作しない可能性があります。

2

警告:次にくるものがハックです。これを行うためのより良い方法は、関数に関数として名前を渡すことです。それは、arguments.calleeのアプローチよりも優れています。しかし、必要ならばそれを使用してください。あなたがErrorオブジェクトを作成する場合は

、あなたは関数名のチェーンを取得するためにstackを検査することができます

new Error().stack.split('\n') 
[ 'Error', 
    ' at repl:1:1', 
    ' at sigintHandlersWrap (vm.js:22:35)', 
    ' at sigintHandlersWrap (vm.js:96:12)', 
    ' at ContextifyScript.Script.runInThisContext (vm.js:21:12)', 
...] 

あなたの発信者の名前は、ファイルと行/ COL情報と共に、そのリストになります。多くのJS関数はという名前ではないであることに注意してください。

関連する問題