我正在执行一项任务,在我们的构建中删除一些JSHint警告。特别是,我正在摆脱“new Function()
”的实例,因为它们是essentially eval
statements。
我在代码中遇到了一个我不理解的奇怪模式,在我知道它的作用之前我不愿意改变。这是一个例子:
if(typeof(someObj.someProperty) === "string"){
someObj.someProperty = new Function("return " + someObj.someProperty + " ;")();
}
我和我的同事都无法弄清楚究竟应该完成什么。我们能想到的最好的结果是,当它是一个字符串时,它是某种克隆属性的尝试。没有人能够弄清楚为什么它被宣布为IIFE。
这是其他人见过的模式吗?如果它是一个克隆,它对字符串是否重要,因为它们是不可变的?
答案 0 :(得分:1)
看起来有人听说他们不应该使用eval
,并决定遵循该建议的字母,而不是精神。换句话说,它或多或少等同于:
if (typeof(someObj.someProperty) === "string") {
someObj.someProperty = eval(someObj.someProperty);
}
确切地说,它完全等同于:
if (typeof(someObj.someProperty) === "string") {
someObj.someProperty = eval("(function () { return " + someObj.someProperty + "; })")();
}
这仍然非常不安全,针对eval
的所有警告同样适用于此。