Возможно ли в коде получить доступ к свойству ["[[FunctionLocation]]"]
, которое инструменты разработчика Google Chrome показывают при использовании консольного входа в функцию?
Программный доступ к расположению функции
Ответы (3)
Пока ответ нет.
Свойство [[FunctionLocation]]
, которое вы видите в Инспекторе, добавлено в V8Debugger::internalProperties()
в коде C++ отладчика, в котором используется другая функция C++ V8Debugger::functionLocation()
для сбора информации о функции. functionLocation()
затем использует ряд специфичных для V8 API-интерфейсов C++, таких как v8::Function::GetScriptLineNumber()
и GetScriptColumnNumber()
, чтобы узнать точную информацию.
Все API, описанные выше, доступны исключительно для кода C++, а не для кода JavaScript. Другими словами, код JavaScript на веб-странице не имеет прямого доступа к этой информации.
Однако вы можете получить доступ к свойствам с помощью расширения Chrome. Совсем недавно в движок JavaScript V8, используемый Chrome, была добавлена поддержка доступа к этим свойствам через Chrome DevTools Protocol а>. В частности, вы можете получить внутренние свойства через вызов Runtime.getProperties
. Кроме того, похоже, что расширения Chrome могут взаимодействовать с протоколом DevTools через < a href="https://developer.chrome.com/extensions/debugger.html" rel="noreferrer">chrome.debugger
.
Доказательство концепции использования протокола DevTools в Node.js, которая имеет прямой доступ к протоколу с помощью Inspector встроенный модуль (услужливо упомянутый Мохамедом в их ответе):
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.js v12.3.1.
[[FunctionLocation]]
в расширении Chrome, а не в инструментах разработчика.
- person mike-pz; 07.08.2019
Я знаю, что прошло некоторое время, когда этот вопрос был опубликован. Теперь у меня была такая же проблема. Мне нужно получить доступ к расположению функции во время выполнения.
К счастью, NodeJS проделал отличную работу, предоставив некоторые внутренние свойства версии 8 через модуль inspector
.
Я написал небольшой модуль под названием 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 с помощью ограниченная языковая поддержка.
Я обнаружил, что имя функции полезно при отладке обратных вызовов и при использовании шаблона наблюдателя. Обратите внимание, что это требует, чтобы функции именования работали (имена анонимных функций, очевидно, пусты).
function myFn() {}
if (typeof myFn === 'function') {
console.log('Name of function', myFn.name)
}
Выходы Name of function myFn
name
является частью стандартного определения объекта Function, то, что ищет OP, является частью новой функции Google Chrome Dev Tools, которая дополнительно раскрывает имя файла, на котором такая функция определяется как [[FunctionName]]
- person Miguel Sánchez Villafán; 15.06.2020