Javascript JS eval()函数,仅用于解释变量

Javascript JS eval()函数,仅用于解释变量,javascript,eval,Javascript,Eval,我用eval来解释一些输入变量 可能的输入是 "somevar" "someobj.someprop['somekey'].someprop" "window.someprop" 等等 然而,我不希望它“执行”任何动作。就像调用任何函数、更改任何值、声明任何变量一样 因此,这些不应被接受(以及任何改变任何事物状态的行为): 可以通过原生js吗 我的目标只是解释复杂的输入变量“address”并返回它。对于类似的内容,您最好解析该值 var steps = input.match(/\['(

我用eval来解释一些输入变量

可能的输入是

"somevar"

"someobj.someprop['somekey'].someprop"

"window.someprop"
等等

然而,我不希望它“执行”任何动作。就像调用任何函数、更改任何值、声明任何变量一样

因此,这些不应被接受(以及任何改变任何事物状态的行为):

可以通过原生js吗


我的目标只是解释复杂的输入变量“address”并返回它。

对于类似的内容,您最好解析该值

var steps = input.match(/\['(?:[^']|\\.)+'\]|\["(?:[^"]|\\.)+"\]|[a-zA-Z0-9_]+/g);
var src = window;
var step;
while(step = steps.shift()) {
    if( step.charAt(0)) {
        // ['...'] or ["..."]
        step = step.substring(2,step.length-2);
    }
    src = src[step];
}
alert(src);

由于您正在解析字符串,因此不存在执行恶意代码的机会。

对于类似的情况,您最好解析值

var steps = input.match(/\['(?:[^']|\\.)+'\]|\["(?:[^"]|\\.)+"\]|[a-zA-Z0-9_]+/g);
var src = window;
var step;
while(step = steps.shift()) {
    if( step.charAt(0)) {
        // ['...'] or ["..."]
        step = step.substring(2,step.length-2);
    }
    src = src[step];
}
alert(src);

由于您正在解析字符串,因此不存在执行恶意代码的机会。

对于类似的情况,您最好解析值

var steps = input.match(/\['(?:[^']|\\.)+'\]|\["(?:[^"]|\\.)+"\]|[a-zA-Z0-9_]+/g);
var src = window;
var step;
while(step = steps.shift()) {
    if( step.charAt(0)) {
        // ['...'] or ["..."]
        step = step.substring(2,step.length-2);
    }
    src = src[step];
}
alert(src);

由于您正在解析字符串,因此不存在执行恶意代码的机会。

对于类似的情况,您最好解析值

var steps = input.match(/\['(?:[^']|\\.)+'\]|\["(?:[^"]|\\.)+"\]|[a-zA-Z0-9_]+/g);
var src = window;
var step;
while(step = steps.shift()) {
    if( step.charAt(0)) {
        // ['...'] or ["..."]
        step = step.substring(2,step.length-2);
    }
    src = src[step];
}
alert(src);


由于您正在解析字符串,因此不存在执行恶意代码的机会。

在这个主题上有很多QA,例如,不,它不是。使用es5 getter,它可以运行一些逻辑。我会将所有这些值锁定到一个对象中。您可能不希望人们覆盖
窗口。文档
。小心eval()这里有一个很好的讨论:我刚刚意识到任何更改状态的代码都必须包含'('或'='您可能会使用解析器生成器,但对于您正在做的事情来说,这可能有些过分:在这个主题上有很多QA,例如,没有。使用es5 getters,它可以运行一些逻辑。我会将所有这些值锁定到一个对象中。您可能不希望人们重写
window.document
。小心eval()这里有一个很好的讨论:我刚刚意识到任何改变状态的代码都必须包含'('或'='您可能会使用解析器生成器,但对于您正在做的事情来说,这可能有些过分:在这个主题上有很多QA,例如,没有。使用es5 getters,它可以运行一些逻辑。我会将所有这些值锁定到一个对象中。您可能不希望人们重写
window.document
。小心eval()这里有一个很好的讨论:我刚刚意识到任何改变状态的代码都必须包含'('或'='您可能会使用解析器生成器,但对于您正在做的事情来说,这可能有些过分:在这个主题上有很多QA,例如,没有。使用es5 getters,它可以运行一些逻辑。我会将所有这些值锁定到一个对象中。您可能不希望人们重写
window.document
。小心eval()这里有一个很好的讨论:我刚刚意识到,任何更改状态的代码都必须包含“(”或“=”,您可能会使用解析器生成器,但对于您所做的工作来说,这可能有些过头了:我已经使用了它的功能。对于类似的解释(“jQuery”)来说不起作用对我来说似乎很好…你确定
窗口。当你调用
解释(“jQuery”)
时定义了jQuery
?我已经完成了它的功能。对like解释(“jQuery”)不起作用对我来说似乎很好…你确定
窗口。当你调用
解释(“jQuery”)时定义了jQuery
?我已经实现了它的功能。对于like解释(“jQuery”)不起作用似乎对我很好…你确定
窗口。当你调用
解释(“jQuery”)时定义了jQuery
?我已经实现了它的功能。对于like解释(“jQuery”)不起作用对我来说似乎很好…您确定在调用
exploration(“jQuery”)
时定义了
window.jQuery