Как DevTools определяет имя конструктора объекта?

Я использую Chrome v22.0.1229.94 m, но это не важно, но на всякий случай: -)

Портативность меня не касается. Пока это работает с Chrome (и Safari), я счастлив.

У меня есть две функции: foo и bar:

var foo = function() {
  ...
}
function bar() {
  ...
}

тогда, если я создам объекты, используя их:

f1 = new foo();
b1 = new bar();

Я могу получить имя конструктора для bar, но не для foo:

> f1.constructor.name  ==> ""
> b1.constructor.name  ==> "bar"

но в обоих случаях консоль DevTools будет показывать имена "foo" и "bar" при проверке переменных f1 и b1.

Как извлечь имя foo для f1, поскольку DevTools может?

enter image description here

Ответ 1

V8 может выполнять вывод имени функции на этапе синтаксического анализа, раскрывая эту информацию через свои API. Вы не сможете извлечь эту информацию, используя обычные свойства объекта.

Ответ 2

В случае foo вы создаете выражение функции. Это означает, что вы назначаете анонимную функцию переменной.

Вы не можете программным способом разрешить функцию name, если только вы не дадите функции имени и не создадите "именованное функциональное выражение".

var foo = function foo() {
  ...
}