javascript decorate C'è mai una buona ragione per passare una stringa a setTimeout?




jquery timeout 1 second (2)

Sappiamo tutti che passare una stringa a setTimeout (o setInterval ) è malvagio, perché è eseguito nell'ambito globale, ha problemi di prestazioni, è potenzialmente insicuro se si iniettano parametri, ecc. Quindi, fare ciò è decisamente deprecato:

setTimeout('doSomething(someVar)', 10000);

a favore di questo:

setTimeout(function() {
    doSomething(someVar);
}, 10000);

La mia domanda è: può mai esserci una ragione per fare il primo? È sempre preferibile? Se non lo è, perché è permesso?

L'unico scenario a cui ho pensato è di voler utilizzare una funzione o una variabile che esiste nello scope globale ma che è stata sovrascritta nell'ambito locale. Mi sembra un pessimo progetto di codice, comunque ...


Answer #1

Puoi sempre usare le variabili globali accedendole come proprietà dell'oggetto window, come window.globalVar (anche se l'uso di globals non è una buona pratica), quindi no, non penso ci sia mai una buona ragione per usare il deprecato sintassi.

Probabilmente è permesso per ragioni storiche: come ha detto Felix Kling, la sintassi originale permetteva solo di passare una stringa di codice:

Introdotto con JavaScript 1.0, Netscape 2.0. Il passaggio di un riferimento all'oggetto Function è stato introdotto con JavaScript 1.2, Netscape 4.0 ; supportato dal DOM MSHTML dalla versione 5.0. [ fonte , la mia enfasi]

Se i browser non supportano l'uso di una stringa come primo argomento per setTimeout e setInterval , ci sarà un sacco di codice su Internet che non funziona più.


Answer #2

Per coloro che vengono reindirizzati qui dalla domanda sul perché sta passando una funzione meglio di passare una stringa .

1: il passaggio di una stringa attiva un compilatore

Ogni volta che si deve valutare una stringa, si attiva un compilatore completo. Per ogni invocazione dove è necessario.

Non solo è lento, ma distrugge tutti gli JIT e gli aumenti del browser.

2: il passaggio di una stringa è MOLTO più limitato.

Poiché una stringa viene eseguita attraverso un compilatore, non è così nettamente legata all'ambito e alle variabili locali.

Mentre non è evidente in situazioni come:

window.setInterval("doThing()");

In una situazione più complessa, il codice è solo più pulito:

window.setInterval("doThing(" + val1 + "," + val2 + ")");

vs

window.setInterval(function() {
  // You can put a debugging point here
  dothing(val1, val2);
});

3: gli oggetti DOM non possono essere passati tramite stringa

Come menzionato Álvaro, gli oggetti DOM non possono essere passati tramite un metodo stringa.

// There is no way to do this via a string.
var el = document.getElementById("my-element");
window.setInterval(function() {
  dothing(el);
});

(Gli altri oggetti possono essere o meno passabili, a seconda che possano essere serializzati, ma in generale sarebbe piuttosto difficile).







settimeout