Avaliando strings JSON - eval () vs. new Function () [duplicado]

9

Dada uma string que representa uma string JSON válida, existe uma diferença entre esses dois métodos de análise:

var str, obj;

str = '{"prop":"value"}';

// method 1:
obj = eval( '(' + str + ')' );

// method 2:
obj = ( new Function( 'return (' + str + ');' ) )();

Eu notei que o jQuery usa o segundo método para analisar strings JSON (em ambientes que não possuem um analisador JSON integrado). Eu me pergunto por que eles não usam o primeiro método. Por que criar um objeto de função e invocá-lo quando você pode usar apenas eval() ?

Por favor, feche como duplicata exata

    
por Šime Vidas 22.11.2011 в 17:43
fonte

3 respostas

3

eval é executado dentro do escopo que foi declarado. Function gera um novo objeto de função com seu próprio escopo e retorna uma referência a essa função que pode ser chamada.

Veja este exemplo:

var x = 123;
var y;
function TestEval()
{
   var y = 1;
   Function("window.alert('Global x: ' + x);")(); //Prints 123
   Function("window.alert('Local y: ' + y);")(); //Prints undefined

   eval("window.alert('Global x: ' + x);"); //Prints 123
   eval("window.alert('Local y: ' + y);"); //Prints 1
}

TestEval();

As duas primeiras chamadas de função imprimem 123 (o valor global de x ) e undefined , o valor global de y .

As duas funções eval imprimirão 123 e 1 (o valor local de y ). Isso ocorre porque eval tem acesso local ao fechamento em que está sendo executado. Esses comportamentos (bem como o fato de que eval é completamente não confiável e inconsistente em muitos navegadores) pode ser aproveitado pela implementação do jQuery.

Nota: Código acima testado no Firefox 8, sua milhagem pode variar:)

    
por Mike Christensen 22.11.2011 / 17:47
fonte
2

Usar eval é ruim porque pode haver muitas falhas de segurança. Você está executando código no escopo global. Function leva isso de maneira diferente, executando em seu próprio escopo. Mas uma coisa Function faz melhor é o desempenho. Olhando para este blog mostra que Function é quase 2x mais rápido em FF2.

Editar: não tenho certeza de quanto é mais seguro quando você executa document.location = "bad-url" , ele ainda seria executado usando Function

    
por Amir Raminfar 22.11.2011 / 17:48
fonte
0

A coisa do escopo global e também não executará nada depois de um ";" por causa do return , isso ajuda um pouco.

    
por Delta 22.11.2011 / 17:50
fonte