2010-11-12 5 views
4

J'essaie de rendre mon code JavaScript "strict", donc je l'exécute par JSLint pour m'assurer que mon code est conforme.JavaScript: Comment éliminer cette erreur?

Cependant, le code suivant:

setTimeout("getExtJs()", 2000); 

Je reçois l'erreur suivante:

Implied eval is evil. Pass a function instead of a string. 

Comment puis-je faire mon code JavaScript "strict"?

+0

Veuillez marquer une réponse comme acceptée. (Cliquez sur la petite coche à côté d'elle). – Adam

Répondre

3

Il ne faut pas se plaindre si vous le faites:

setTimeout(function(){ 
    // your code of this function getExtJs here 
}, 2000); 

Ou:

setTimeout(getExtJs, 2000); 

Bien que je ne vois rien de mal dans votre niveau de la sécurité mise en œuvre ou autrement.

+0

En note - ce n'est pas une bonne idée d'utiliser une fonction anonyme pour exécuter une autre fonction qui pourrait être appelée par son nom. N'utilisez les fonctions anonymes que si vous avez l'intention de les exécuter une seule fois, ce qui ne se répétera jamais ailleurs ou si vous avez d'importantes exigences de portée. – mway

+0

@mway: Yup convenu :) – Sarfraz

14
setTimeout(getExtJs, 2000); 

Notez qu'il n'y a pas de guillemets autour de getExtJs, je passe la fonction pas une chaîne.

EDIT: Comme il est indiqué dans les commentaires la raison pour laquelle JSLint est bouleversé est que lorsque le premier argument est une chaîne, il est traité comme code à exécuter de la même manière que eval()

Voir Pour savoir pourquoi eval() (et par extension en utilisant Strings comme 1er argument ici) est maléfique, voir Mozilla Developer Network entry for eval.

+1

+1. Mais pour une complétude absolue, vous pourriez vouloir ajouter comment les chaînes sont évaluées si elles sont passées en premier argument, tandis que les expressions ne le sont pas. – Gopherkhan

1

Comme il est dit, passer dans la fonction (sans les guillemets autour du nom de la fonction):

setTimeout(getExtJs, 2000); 

Lorsque vous passez dans une chaîne ("getExtJs"), fin setTimeout jusqu'à eval ing il. Au lieu de cela, il est préférable de simplement passer dans la fonction elle-même (getExtJs).

+0

Cela va définir le résultat de getExtJs() comme le premier paramètre de setTimeout, ce qui n'est probablement pas l'effet désiré. – mway

+0

cela exécutera la fonction immédiatement et exécutera ce que 'getExtJs' renvoie 2 secondes à partir de maintenant, ce qui n'est pas le cas de l'OP. – lincolnk

+0

@mway, @lincolnk - tout à fait raison. Réponse mise à jour – Oded

1
setTimeout(function() {getExtJs();}, 2000); 
1

La syntaxe correcte est

setTimeout(getExtJs, 2000); 

Vous passez une référence à la fonction, et après 2000ms la fonction est exécutée. Si vous mettez parens après le nom de la fonction, vous exécutez la fonction au lieu de la référencer.

Questions connexes