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