Problema: Il problema eval pone è che si esegue in ambito globale
eval.call(document, "console.log(this)")
eval.call(navigator, "console.log(this)")
eval.call(window, "console.log(this)")
(function(){eval.call(document, "console.log(this)")})()
>Window
Scenario:
utente si assume stanno usando singoli attributi nel codice di markup di vari docum ent-elementi come un attributo onvisible
<img src="" onvisible="src='http://www.example.com/myimg.png';">
Desiderate ottenere tutti gli elementi con questo attributo, ruotare il onvisible-content-stringa in una chiusura e metterlo in una coda EventHandler. È qui che entra in gioco il costruttore della funzione JS.
Function === 0..constructor.constructor
>true
Function('return [this, arguments]').call(window, 1,2,3)
>Window, Arguments[3]]
Function('return [this, arguments]').call(document, 1,2,3)
>Document, Arguments[3]]
Function('return [this, arguments]').call(navigator, 1,2,3)
>Navigator, Arguments[3]]
Mettere tutto insieme:
var eventQueue = [];
var els = document.querySelectorAll('[onvisible]');
for (var el in els) {
var jscode = els[el].getAttribute('onvisible');
eventQueue.push({el:els[el], cb:Function(jscode)})
}
//eventQueue[0].cb.call(scope, args);
fonte
2012-04-30 07:26:29
Dai un'occhiata alla: http://stackoverflow.com/questions/86513/why-is-using-javascript-eval-function-a-bad -idea –
Penso che in questo caso la valutazione non sia malvagia ... Forse dovresti dare un'occhiata a questa domanda: [Quando l'eval() di JavaScript non è il male?] (http://stackoverflow.com/questions/197769/ when-is-javascripts-eval-not-evil) –