Как я могу печатать функции в Node.js так же, как Firefox печатает функции (а именно дает имя)?

var fun1=function(){console.log('hello');}
var fun2=fun1
console.log(fun2);

Приведенный выше код, запущенный в Firefox, печатает fun2. В Chrome он печатает тело функции, в Node.js — Function.

Почему эта разница?

Как я могу получить поведение Firefox в Node.js?

Почему я это спрашиваю?

Я спрашиваю об этом, потому что хочу отлаживать код JS, сгенерированный из Idris, где среда выполнения JS использует явный стек вызовов, и я хотел бы распечатать содержимое стека вызовов осмысленным образом, и Firefox делает это лучше всего, но я хочу отлаживать код на Node.js, поэтому я хотел бы, чтобы Node.js печатал функции как Firefox, как я могу это сделать?

РЕДАКТИРОВАТЬ:

Типичная скомпилированная функция выглядит так:

var _idris__123_io_95_bind2_125_ = function(oldbase){
  var myoldbase = new i$POINTER();
  i$valstack_top += 1;
  i$ret = new i$CON(65646,[i$valstack[i$valstack_base],i$valstack[i$valstack_base + 1],i$valstack[i$valstack_base + 2],i$valstack[i$valstack_base + 3],i$valstack[i$valstack_base + 4],i$valstack[i$valstack_base + 5]],_idris__123_APPLY0_125_$65646,null);
  i$valstack_top = i$valstack_base;
  i$valstack_base = oldbase.addr;
}

Так что здесь полезной информацией является само имя переменной _idris__123_io_95_bind2_125_, и это то, что печатает Firefox, а не node.js, и в этом проблема, Firfox печатает полезную информацию, а node.js нет.

Итак, вопрос в том, как я могу заставить node.js печатать _idris__123_io_95_bind2_125_ для вышеуказанной функции?

РЕДАКТИРОВАТЬ 2:

К сожалению, некоторые из предложений не работают:

>cat deb.js
var fun1=function(){console.log('hello');}
var fun2=fun1
console.log(fun2);
console.log(fun2.name);
console.log(fun2.toString());
console.log(fun2+'');
>node deb.js
[Function]

function (){console.log('hello');}
function (){console.log('hello');}
>

person jhegedus    schedule 08.03.2016    source источник
comment
Попробуйте console.log(fun2 + '');   -  person Dmitri Pavlutin    schedule 08.03.2016


Ответы (2)


вам нужно преобразовать его в строку, попробуйте следующее:

console.log(fun2.toString());
person shaouari    schedule 08.03.2016
comment
Спасибо, это печатает тело функции, но не fun2. - person jhegedus; 08.03.2016

ОБНОВЛЕНИЕ: работает и с v0.12.7. Так что я думаю, что это будет работать со всеми версиями узла.

В узле Следующие работы

function someCoolFuntion (){
    /* Some code */
}
var fun1 = someCoolFuntion;

//Show name; Similar to Firefox's behaviour!
console.log(fun1.name)

//Show fullbody; Chrome's behaviour (as shaouari suggested)
console.log(fun1.toString());

Выход

введите здесь описание изображения

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

person Dave Amit    schedule 08.03.2016
comment
Привет, спасибо, это печатает тело функции, но не func2 (то, что печатает Firefox), и это имя было бы полезно знать. - person jhegedus; 08.03.2016
comment
Другими словами, fun.name печатает пустую строку. Действительно странно. - person jhegedus; 08.03.2016
comment
О, это ожидаемое поведение, :( ... потому что функция выглядит так: var x = function () ...., x.name напечатает имя функции. Это означает, что var x = function abc() ..., x.name напечатает abc. Есть смысл? Я все еще изучаю этот вопрос. Просто хотел передать что это было ожидаемое поведение. :) - person Dave Amit; 08.03.2016
comment
Да, я согласен, несколько странно, как и почему Firefox это делает, но кажется, что это довольно полезно, отсюда и этот вопрос. Было бы неплохо иметь эту функцию и в node.js. - person jhegedus; 08.03.2016
comment
@jhegedus ... Насколько я смог найти и понять. Невозможно получить программный доступ к variable name, хотя можно перечислить имя параметра данной функции, но имя извлечения переменной (например, то, что вы ожидаете --- как Firefox) невозможно :( потому что ref передается вдоль, а не variable является самостоятельным, что означает: var x = function(){} и когда я делаю console.log(x), он просто передает ссылку function(){} и никаких следов x. - person Dave Amit; 08.03.2016
comment
Спасибо, Дэйв, мне помогли с #idris, и теперь я изменил генератор кода, чтобы включить недостающую информацию. - person jhegedus; 08.03.2016