我试图在特定的上下文中执行eval.我发现这里的答案很有用.但是,我在Chrome版本53.0.2785.143 m中收到以下行为.没试过其他浏览器.我使用的代码如下:
function evalInContext(js, context) {
return function() { return eval(js); }.call(context);
}
console.log(evalInContext('x==3', { x : 3})) // Throws
console.log(evalInContext('this.x==3', { x : 3})) // OK
Run Code Online (Sandbox Code Playgroud)
不过我期待第一次打电话evalInContext不要扔.任何想法为什么会这样?
虽然我推荐@trincot提供的答案,特别是伟大的链接.我在这里发布我遇到的问题的解决方案
function evalInContext(scr, context)
{
// execute script in private context
return (new Function( "with(this) { return " + scr + "}")).call(context);
}
Run Code Online (Sandbox Code Playgroud)
该with(this)表达式允许context对象的成员变量出现在表达式的执行范围中scr.
x解析变量的方式与上下文无关。它由作用域规则解决:是否有任何闭包定义了该变量?如果没有,请查看全局对象。在任何时候都不会通过查看上下文来解析变量。
你可以看看这篇文章。
行为不特定于eval,与其他函数相同:
"use strict";
var obj = { x : 3};
var y = 4;
function test() {
console.log(this.x); // 3
console.log(typeof x); // undefined
}
test.call(obj);
function test2() {
console.log(this.y); // 4
console.log(typeof y); // number
}
test2.call(window);Run Code Online (Sandbox Code Playgroud)