Показать сообщение отдельно
  #2 (permalink)  
Старый 06.07.2014, 12:27
Аватар для kobezzza
Быдлокодер;)
Отправить личное сообщение для kobezzza Посмотреть профиль Найти все сообщения от kobezzza
 
Регистрация: 19.11.2010
Сообщений: 4,338

Общее то, что они работают со строками, т.е. компилируют строки в 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);');
}
__________________
kobezzza
code monkey
Ответить с цитированием