以编程方式访问函数位置

Access function location programmatically

是否可以在代码中访问 ["[[FunctionLocation]]"] 属性 google chrome 开发人员工具在使用控制台登录功能时显示?

目前的答案是

您在 Inspector 中看到的 [[FunctionLocation]] 属性 添加到 V8Debugger::internalProperties() in the debugger's C++ code, which uses another C++ function V8Debugger::functionLocation() to gather information about the function. functionLocation() then uses a number of V8-specific C++ APIs such as v8::Function::GetScriptLineNumber() and GetScriptColumnNumber() 以查找确切信息。

上述所有 API 仅适用于 C++ 代码,不适用于 JavaScript 代码。换句话说,网页上的 JavaScript 代码无法直接访问此信息。


但是,您可以使用 Chrome 扩展程序访问属性。最近,Chrome 使用的 V8 JavaScript 引擎增加了通过 Chrome DevTools Protocol. In particular, you can get the internal properties through the Runtime.getProperties call. Additionally, it seems like Chrome extensions may be able to interact with the DevTools protocol through chrome.debugger.

访问这些属性的支持

在 Node.js 中使用 DevTools 协议的概念证明,它可以使用 Inspector built-in 模块直接访问协议(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.js v12.3.1.

console.log可以用limited language support.

显示Chrome中的函数名

我发现函数名称在调试回调和使用 observer pattern 时很有用。请注意,这需要命名函数才能工作(匿名函数名称显然是空白)。

function myFn() {}

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

输出Name of function myFn

我知道这个问题发布已经有一段时间了。现在,我遇到了同样的问题。我需要在运行时访问函数位置。

幸运的是,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 }
})();

希望对您有所帮助。