实际上,您可以通过函数进行抽象来完成此操作:
var context = { a: 1, b: 2, c: 3 };
function example() {
console.log(this);
}
function evalInContext() {
console.log(this); //# .logs `{ a: 1, b: 2, c: 3 }`
eval("example()"); //# .logs `{ a: 1, b: 2, c: 3 }` inside example()
}
evalInContext.call(context);
因此,您可以使用call
所需的函数context
并eval
在该函数内运行。
奇怪的是,这似乎在本地对我有用,但在Plunkr上不起作用!?
对于简洁(并且可以说是多汁的;)版本,您可以逐字复制到您的代码中,请使用:
function evalInContext(js, context) {
//# Return the results of the in-line anonymous function we .call with the passed context
return function() { return eval(js); }.call(context);
}
编辑:不要混淆this
和“范围”。
//# Throws an error as `this` is missing
console.log(evalInContext('x==3', { x : 3}))
//# Works as `this` is prefixed
console.log(evalInContext('this.x==3', { x : 3}))
虽然可以这样做:
function evalInScope(js, contextAsScope) {
//# Return the results of the in-line anonymous function we .call with the passed context
return function() { with(this) { return eval(js); }; }.call(contextAsScope);
}
为了缩小差距,这不是 OP 提出的问题,它使用的是with
,正如 MDN 所说:
不推荐使用 with 语句,因为它可能是混淆错误和兼容性问题的根源。有关详细信息,请参阅下面“描述”部分中的“歧义反义词”段落。
但它确实有效,而且还不算太“坏”(不管这意味着什么),只要人们意识到这种调用可能引起的奇怪之处。