В чем сходство Function и Eval?
У крокфорда в good parts есть утверждение, что Function -- это, почти то же самое что eval. Я копаюсь уже битый час, и не могу понять вообще, что у них общего. Насколько я понял, Function сразу компилируется в обычную анонимную ф-цию. И в дальнейшем, она ведет себя как обычная ф-ция, даже с сохранением лексического скопа в замыканиях.
Код:
fu=Function("var a=1; return function(){return(a)}") |
Общее то, что они работают со строками, т.е. компилируют строки в JS. Function всегда создаёт глобальные функции, т.е.
var a = 1; (function () { var a = 2; new Function('alert(a)')(); // 1 })(); A eval работает в том контексте, в котором он был вызван. var a = 1; (function () { var a = 2; eval('alert(a)'); // 2 })(); В 99% случаев лучше использовать Function, т.к. для такого кода также используется JIT компилятор VM, а вот для eval конструкций нет и это может серьёзно сказаться на производительности, а самое страшное то, что вызов eval внутри блока также отменяет использование JIT для всего блока: // Очень быстрый цикл, т.к. используется JIT for (var i = 0; i < 1e6; i++) { console.log(el); } // Всё будет очень тормозить, т.к. вызов eval внутри цикла отменил использование JIT для всей конструкции. for (var i = 0; i < 1e6; i++) { eval('console.log(el);'); } |
Цитата:
// Парсинг строки как литерала объекта var a = '({a: 1, b: 2})'; eval(a); // {a: 1, b: 2} new Function('return ' + a)(); // {a: 1, b: 2} // Создание функции из строки (однако следует помнить про то, что у функций будет разный контекст) eval('(function (a, b) { return a + b; })')(1, 2) // 3 new Function('a', 'b', 'return a + b')(1, 2) // 3 |
var a = '{a: 1, b: 2}'; eval(a); // {a: 1, b: 2}kobezzza, ёшкин кот, этож классический пример. eval(a); //syntax error |
Цитата:
|
Цитата:
Код:
Код:
a=1 |
Цитата:
Цитата:
Цитата:
ЗЫ: а вообще ты мне надоел, можешь гавнокодить как тебе захочется. |
Цитата:
a=eval("(function(){'test'})") 3: 1267ms |
Цитата:
|
Т.е. ты не видешь, что
Function("test") и function(){"test"} Это разные по функционалу функции? alert(Function("test").toString()) Более того, на таких убогий тестах вообще нельзя делать никаких выводов. |
Часовой пояс GMT +3, время: 06:15. |