Javascript “的目的是什么?”;新函数();,尤其是作为一个生命?

Javascript “的目的是什么?”;新函数();,尤其是作为一个生命?,javascript,Javascript,我正在执行一项任务,以删除构建中的一些JSHint警告。特别是,我正在删除“new Function()”的实例,因为它们是 我在我们的代码中遇到了一个奇怪的模式,我不理解它,在知道它的作用之前,我不愿意改变它。下面是一个例子: if(typeof(someObj.someProperty) === "string"){ someObj.someProperty = new Function("return " + someObj.someProperty + " ;")(); } 我和我的同

我正在执行一项任务,以删除构建中的一些JSHint警告。特别是,我正在删除“
new Function()
”的实例,因为它们是

我在我们的代码中遇到了一个奇怪的模式,我不理解它,在知道它的作用之前,我不愿意改变它。下面是一个例子:

if(typeof(someObj.someProperty) === "string"){
someObj.someProperty = new Function("return " + someObj.someProperty + " ;")();
}
我和我的同事都不知道这到底应该实现什么。我们能想到的最好办法是,当属性是一个字符串时,它是一种克隆属性的尝试。没有人能弄明白为什么它被宣布为生命


这是其他人见过的模式吗?如果它是一个克隆,那么字符串是不可变的,这对它们有影响吗?

似乎有人听说他们不应该使用
eval
,并决定遵循该建议的字母,而不是精神。换句话说,它或多或少相当于:

if (typeof(someObj.someProperty) === "string") {
    someObj.someProperty = eval(someObj.someProperty);
}
if (typeof(someObj.someProperty) === "string") {
    someObj.someProperty = eval("(function () { return " + someObj.someProperty + "; })")();
}
准确地说,它完全等同于:

if (typeof(someObj.someProperty) === "string") {
    someObj.someProperty = eval(someObj.someProperty);
}
if (typeof(someObj.someProperty) === "string") {
    someObj.someProperty = eval("(function () { return " + someObj.someProperty + "; })")();
}

这仍然非常不安全,所有针对
eval
的警告在这里同样适用

没有;这只是评估属性,我没有克隆属性。如果
someProperty
“2+2”
,则新函数将返回
4
。正如您在第一段中所说,它本质上是一个
eval
语句。这将把字符串转换为其他类型,或者在无法转换值时给出语法错误。进一步挖掘之后,事实正是如此。这些过去是
eval()
语句。这里真正发生的是代码通过名称空间和名称查找对象;有点像穷人的影子。这不是一个可读性和可维护性都很差的模式。@Chad:一点也不!您应该解析字符串并显式执行所有查找。也将允许更好的错误消息