関数でコンソールログを使用するときにgoogle chrome開発者ツールが表示する["[[FunctionLocation]]"]
プロパティにアクセスすることはコードで可能ですか?
今のところ、答えはnoです。
Inspectorに表示される_[[FunctionLocation]]
_プロパティは、別のC++関数を使用するデバッガーのC++コードの V8Debugger::internalProperties()
に追加されます V8Debugger::functionLocation()
関数に関する情報を収集します。次に、functionLocation()
は、 v8::Function::GetScriptLineNumber()
やGetScriptColumnNumber()
などのV8固有のC++ APIを使用して、正確な情報を見つけます。
上記のすべてのAPIは、JavaScriptコードではなく、C++コードでのみ使用できます。つまり、WebページのJavaScriptコードは、この情報に直接アクセスできません。
ただし、Chrome拡張機能を使用してプロパティにアクセスできる場合があります。最近では、Chromeが使用するV8JavaScriptエンジンにアクセスのサポートが追加されましたこれらのプロパティは Chrome DevTools Protocol を介して取得できます。特に、内部プロパティは _Runtime.getProperties
_ 呼び出しを介して取得できます。さらに、 のように見えます Chrome拡張機能は _chrome.debugger
_ を介してDevToolsプロトコルと対話できる場合があります。
Node.jsでDevToolsプロトコルを使用するための概念実証。これは、 Inspector 組み込みモジュールを使用してプロトコルに直接アクセスできます(Mohamedが回答で参考に述べています)。
_global.a = () => { /* test function */ };
const s = new (require('inspector').Session)();
s.connect();
let objectId;
s.post('Runtime.evaluate', { expression: 'a' }, (err, { result }) => {
objectId = result.objectId;
});
s.post('Runtime.getProperties', { objectId }, (err, { internalProperties }) => {
console.log(internalProperties);
});
_
収量
_[
{
name: '[[FunctionLocation]]',
value: {
type: 'object',
subtype: 'internal#location',
value: [Object],
description: 'Object'
}
},
{
name: '[[Scopes]]',
value: {
type: 'object',
subtype: 'internal#scopeList',
className: 'Array',
description: 'Scopes[2]',
objectId: '{"injectedScriptId":1,"id":24}'
}
}
]
_
node.jsv12.3.1で。
この質問が投稿されてからしばらく経ちました。今、私は同じ問題を抱えていました。ランタイムで関数の場所にアクセスする必要があります。
幸い、NodeJSは、 inspector
モジュールを介していくつかのv8内部プロパティを公開することで素晴らしい仕事をしました。
func-loc
という小さなモジュールを作成しました。これは、ランタイムで関数の場所を取得するのに役立ちます。
例:
const { locate } = require('func-loc');
const fn = () => {
console.log('Hello there');
};
(async () => {
const result = await locate(fn);
console.log(result);
// Will result: { source: 'file://__BASE_FOLDER__/func-loc/this-file.js', line: 3, column: 12 }
})();
お役に立てば幸いです。
console.logは、Chrome with 制限された言語サポート で関数名を表示できます。
関数名は、コールバックのデバッグや オブザーバーパターン を使用するときに役立つことがわかりました。これには名前付け関数が機能する必要があることに注意してください(匿名関数名は明らかに空白です)。
function myFn() {}
if (typeof myFn === 'function') {
console.log('Name of function', myFn.name)
}
出力Name of function myFn