【问题标题】:How to eliminate error: "Implied eval is evil"如何消除错误:“隐含的 eval 是邪恶的”
【发布时间】:2010-11-12 18:07:34
【问题描述】:

我正在尝试使我的代码 JavaScript “严格”,所以我通过 JSLint 运行它以确保我的代码是合规的。

但是,在以下代码中:

setTimeout("getExtJs()", 2000);

我收到以下错误:

隐含的 eval 是邪恶的。传递一个函数而不是一个字符串。

如何使我的代码 JavaScript “严格”?

【问题讨论】:

标签: javascript jslint


【解决方案1】:
setTimeout(getExtJs, 2000);

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

编辑: 正如 cmets 中所指出的,JSLint 不高兴的原因是,当第一个参数是 String 时,它被处理为要以与 eval() 相同的方式执行的代码

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

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

【讨论】:

  • +1。但是为了绝对的完整性,如果作为第一个参数传递,您可能想要添加如何评估字符串,而表达式不是。
【解决方案2】:

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

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

或者:

setTimeout(getExtJs, 2000);

尽管我在您的实施安全方面或其他方面没有发现任何问题。

【讨论】:

  • 附带说明 - 使用匿名函数执行另一个可以通过名称调用的函数不是一个好主意。如果您打算一次性执行且不会在其他地方重复,或者如果您有主要的范围界定要求,请仅使用匿名函数。
【解决方案3】:

就像它说的那样,传入函数(函数名周围没有引号):

setTimeout(getExtJs, 2000);

当你传入一个字符串 ("getExtJs") 时,setTimeout 会以 evaling 结束。与其这样,不如直接传入函数本身 (getExtJs)。

【讨论】:

  • 这会将getExtJs()的结果设置为setTimeout的第一个参数,这可能不是想要的效果。
  • 这将立即执行该函数并运行getExtJs 2 秒后返回的任何内容,这不是 OP 所做的。
【解决方案4】:
setTimeout(function () {getExtJs();}, 2000);

【讨论】:

    【解决方案5】:

    正确的语法是

    setTimeout(getExtJs, 2000);
    

    您传递了对函数的引用,并且在 2000 毫秒后执行该函数。如果你在函数名后面加上括号,你是在执行函数而不是引用它。

    【讨论】:

      猜你喜欢
      • 2011-04-28
      • 2012-10-20
      • 2011-02-04
      • 2010-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-12
      相关资源
      最近更新 更多