How to eliminate error: “Implied eval is evil”

2019-06-27 04:39发布

问题:

I'm trying to make my code JavaScript "strict", so I'm running it through JSLint to ensure my code is compliant.

However, on the following code:

setTimeout("getExtJs()", 2000);

I receive the following error:

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

How do I make my code JavaScript "strict"?

回答1:

setTimeout(getExtJs, 2000);

Note that there are no quotes around getExtJs, I am passing the function not a String.

EDIT: As noted in the comments the reason why JSLint is upset is that when the first argument is a String it is processed as code to be executed in the same manner as eval()

See https://developer.mozilla.org/en/window.setTimeout

To find out why eval() (and by extension using Strings as the 1st argument here) is evil see the Mozilla Developer Network entry for eval.



回答2:

It shouldn't complain if you do:

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

Or:

setTimeout(getExtJs, 2000);

Although I don't see anything wrong in your implementation security-wise or otherwise.



回答3:

Like it says, pass in the function (no quotes around the function name):

setTimeout(getExtJs, 2000);

When you pass in a string ("getExtJs"), setTimeout end up evaling it. Instead of that, it is better to simply pass in the function itself (getExtJs).



回答4:

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


回答5:

The correct syntax is

setTimeout(getExtJs, 2000);

You pass a reference to the function, and after 2000ms the function is executed. If you put parens after the function name, you are executing the function instead of referencing it.