Программный доступ к расположению функции

Возможно ли в коде получить доступ к свойству ["[[FunctionLocation]]"], которое инструменты разработчика Google Chrome показывают при использовании консольного входа в функцию?


person Sushruth    schedule 14.12.2016    source источник


Ответы (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.

person Timothy Gu    schedule 15.01.2017
comment
Это настоящая наука, спасибо, что глубоко погрузились в это и объяснили это, а не спекуляции или колдовство. - person CTS_AE; 10.05.2018
comment
Тимоти, ты знаешь ответ на этот вопрос? Попытка получить доступ к [[FunctionLocation]] в расширении Chrome, а не в инструментах разработчика. - person mike-pz; 07.08.2019
comment
@ mike-pz Я ответил на этот вопрос, а также дополнил этот ответ дополнительной информацией о расширениях. - person Timothy Gu; 30.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 }
})();

Надеюсь, это поможет.

person Mohamed IDRISSI    schedule 08.04.2019

console.log может отображать имя функции в Chrome с помощью ограниченная языковая поддержка.

Я обнаружил, что имя функции полезно при отладке обратных вызовов и при использовании шаблона наблюдателя. Обратите внимание, что это требует, чтобы функции именования работали (имена анонимных функций, очевидно, пусты).

function myFn() {}

if (typeof myFn === 'function') {
  console.log('Name of function', myFn.name)
}

Выходы Name of function myFn

person Simon Hutchison    schedule 18.10.2017
comment
Я не буду отрицать этот ответ, потому что он может быть полезен для кого-то еще, но name является частью стандартного определения объекта Function, то, что ищет OP, является частью новой функции Google Chrome Dev Tools, которая дополнительно раскрывает имя файла, на котором такая функция определяется как [[FunctionName]] - person Miguel Sánchez Villafán; 15.06.2020