2010-11-12 93 views
4

我试图让我的代码JavaScript“严格”,所以我通过运行它JSLint确保我的代码是兼容的。JavaScript:如何消除此错误?

然而,在下面的代码:

setTimeout("getExtJs()", 2000); 

我收到以下错误:

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

如何让我的代码JavaScript的 “严”?

+0

请标记为已接受的答案。 (点击旁边的小复选标记)。 – Adam 2012-09-06 23:34:40

回答

3

如果你这样做不应该抱怨:

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

或者:

setTimeout(getExtJs, 2000); 

虽然我看不出有什么错在你实现安全,明智或以其他方式。

+0

作为一个方面说明 - 使用匿名函数执行另一个可以按名称调用的函数并不是一个好主意。如果您打算一次性执行,而且其他地方从不重复,或者您有重大的范围要求,则只能使用匿名函数。 – mway 2010-11-12 18:15:31

+0

@ mway:烨同意:) – Sarfraz 2010-11-12 18:16:25

14
setTimeout(getExtJs, 2000); 

请注意,getExtJs周围没有引号,我传递的函数不是String。

编辑: 作为评价为什么JSLint的是不高兴的原因是注意,当第一个参数是作为代码以相同的方式,与eval()

见执行其处理的字符串https://developer.mozilla.org/en/window.setTimeout

要了解为什么eval()(以及使用字符串作为第一个参数的扩展名)是邪恶的,请参阅Mozilla Developer Network entry for eval

+1

+1。但为了绝对完整,您可能想要添加如何将字符串作为第一个参数进行评估,而将表达式作为第一个参数进行评估。 – Gopherkhan 2010-11-12 19:32:47

1

像它说,在传递函数(周围的函数名称不包括引号):

setTimeout(getExtJs, 2000); 

当您在一个字符串("getExtJs")传球,setTimeout结束了eval荷兰国际集团它。取而代之的是,最好简单地传递函数本身(getExtJs)。

+0

这将设置getExtJs()的结果作为setTimeout的第一个参数,这可能不是所需的效果。 – mway 2010-11-12 18:10:52

+0

这将立即执行该函数并运行任何'getExtJs'从现在开始返回2秒,这不是OP所做的。 – lincolnk 2010-11-12 18:11:23

+0

@mway,@lincolnk - 很对。答案已更新。 – Oded 2010-11-12 18:11:57

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

正确的语法是

setTimeout(getExtJs, 2000); 

你传递给函数的引用,2000毫秒后执行的功能。如果你在函数名后面加上parens,那么你正在执行函数而不是引用它。