不使用此关键字的上下文中的javascript eval

Joe*_*Joe 4 javascript eval

我试图在特定的上下文中执行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不要扔.任何想法为什么会这样?

Joe*_*Joe 7

虽然我推荐@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.

相信这个类似问题的答案


tri*_*cot 5

范围和上下文不一样

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)