Проблема в том, что он ссылается на name
функции-конструктора. Это быстро превращается в обсуждение функциональных выражений и операторов, а также свойства имени. Оказывается, совершенно невозможно создать новую именованную функцию во время выполнения без использования eval. Имена могут быть указаны только с помощью функционального оператора function fnName(){}
, и невозможно создать этот фрагмент кода динамически, кроме его оценки. var fnExpression = function(){}
приводит к присвоению переменной анонимной функции. Свойство name
функций неизменяемо, так что дело сделано. Использование Function("arg1", "arg2", "return 'fn body';")
также может создать только анонимную функцию, несмотря на то, что она похожа на eval.
В основном это просто недосмотр в спецификации JS (Брендан Эйх заявил, что сожалеет о том, что определил отображаемое имя так, как он это сделал 10 или около того лет назад), и обсуждается решение для ES6. Это введет больше семантики для получения отображаемого имени функции для инструментов отладки или, возможно, явный способ его установки и настройки.
На данный момент у вас есть один путь: eval или какая-либо другая форма позднего выполнения настраиваемого кода. (eval под любым другим именем...)
function displayName(name, o){
var F = eval("1&&function "+name+"(){}");
F.prototype = o;
return new F;
}
Сам по себе оператор функции не вернется из eval, но выполнение 1 && fnStatement
приводит к выражению, которое можно вернуть.
(Прокси-серверы Harmony также позволяют настраивать функции, которые сообщают имена, которые вы можете настроить без eval, но в настоящее время их нельзя использовать, кроме как в Node.js и Firefox).
Отмечу здесь, что все те "злые" функции, на которые наткнулся Крокфорд и многие другие, ВСЕ на своем месте. eval
, with
, расширяющие нативы, все они позволяют использовать определенные методы, которые в противном случае совершенно невозможны, и нет ничего плохого в том, чтобы использовать их в подходящем случае. Вполне вероятно, что большинство людей не имеют права судить о том, когда настало подходящее время. На мой взгляд, безобидное использование eval
для компенсации плохой языковой семантики и инструментов в ожидании решения вполне приемлемо и не причинит вам никакого вреда, если вы не направляете произвольный код в это выражение eval.
person
Community
schedule
10.11.2011