【发布时间】:2010-11-12 18:07:34
【问题描述】:
我正在尝试使我的代码 JavaScript “严格”,所以我通过 JSLint 运行它以确保我的代码是合规的。
但是,在以下代码中:
setTimeout("getExtJs()", 2000);
我收到以下错误:
隐含的 eval 是邪恶的。传递一个函数而不是一个字符串。
如何使我的代码 JavaScript “严格”?
【问题讨论】:
标签: javascript jslint
我正在尝试使我的代码 JavaScript “严格”,所以我通过 JSLint 运行它以确保我的代码是合规的。
但是,在以下代码中:
setTimeout("getExtJs()", 2000);
我收到以下错误:
隐含的 eval 是邪恶的。传递一个函数而不是一个字符串。
如何使我的代码 JavaScript “严格”?
【问题讨论】:
标签: javascript jslint
setTimeout(getExtJs, 2000);
请注意,getExtJs 周围没有引号,我传递的函数不是字符串。
编辑: 正如 cmets 中所指出的,JSLint 不高兴的原因是,当第一个参数是 String 时,它被处理为要以与 eval() 相同的方式执行的代码
见https://developer.mozilla.org/en/window.setTimeout
要找出为什么 eval() (以及在这里使用字符串作为第一个参数的扩展)是邪恶的,请参阅Mozilla Developer Network entry for eval。
【讨论】:
如果你这样做,它不应该抱怨:
setTimeout(function(){
// your code of this function getExtJs here
}, 2000);
或者:
setTimeout(getExtJs, 2000);
尽管我在您的实施安全方面或其他方面没有发现任何问题。
【讨论】:
就像它说的那样,传入函数(函数名周围没有引号):
setTimeout(getExtJs, 2000);
当你传入一个字符串 ("getExtJs") 时,setTimeout 会以 evaling 结束。与其这样,不如直接传入函数本身 (getExtJs)。
【讨论】:
getExtJs 2 秒后返回的任何内容,这不是 OP 所做的。
setTimeout(function () {getExtJs();}, 2000);
【讨论】:
正确的语法是
setTimeout(getExtJs, 2000);
您传递了对函数的引用,并且在 2000 毫秒后执行该函数。如果你在函数名后面加上括号,你是在执行函数而不是引用它。
【讨论】: