有没有办法在一个特定的作用域(而不是全局的)上执行eval
例如,以下代码无法工作(第二条语句中未定义a),因为它们在不同的作用域中:
eval(var a = 1);
eval(alert(a));
如果可能的话,我想即时创建一个作用域。例如(语法肯定是错误的,但只是为了说明想法)
var scope1;
var scope2;
with scope1{
eval(var a = 1); eval(alert(a)); // this will alert 1
}
with scope2{
eval(var a = 1); eval(a++); eval(alert(a)); // this will alert 2
}
with scope1{
eval(a += 2); eval(alert(a)); // this will alert 3 because a is already defined in scope1
}
有没有关于如何实现这样的事情的想法?谢谢!
发布于 2012-03-20 12:20:40
您可以使用"use strict"将eval代码包含在eval本身中。
其次,严格模式代码的eval
不会将新变量引入到周围的作用域中。在普通代码中,eval("var x;")
会在周围的函数或全局作用域中引入一个变量x
。这意味着,一般来说,在包含对eval
的调用的函数中,每个没有引用参数或局部变量的名称都必须在运行时映射到特定的定义(因为该eval
可能引入了一个隐藏外部变量的新变量)。在严格模式下,eval
仅为要计算的代码创建变量,因此eval不会影响名称是引用外部变量还是某些局部变量
var x = 17; //a local variable
var evalX = eval("'use strict'; var x = 42; x"); //eval an x internally
assert(x === 17); //x is still 17 here
assert(evalX === 42); //evalX takes 42 from eval'ed x
如果一个函数被声明为"use strict",那么其中的所有内容都将在严格模式下执行。下面的代码将执行与上面相同的操作:
function foo(){
"use strict";
var x = 17;
var evalX = eval("var x = 42; x");
assert(x === 17);
assert(evalX === 42);
}
发布于 2016-10-27 00:53:14
将您希望在作用域中存在的变量创建为函数中的局部变量。然后,从该函数返回一个本地定义的函数,该函数只有一个参数,并对其调用eval
。该eval
实例将使用其包含函数的作用域,该作用域嵌套在顶级函数的作用域中。每次调用顶级函数都会使用eval函数的新实例创建一个新的作用域。为了保持所有内容的动态性,您甚至可以在顶级函数中使用对eval
的调用来声明该作用域的局部变量。
示例代码:
function makeEvalContext (declarations)
{
eval(declarations);
return function (str) { eval(str); }
}
eval1 = makeEvalContext ("var x;");
eval2 = makeEvalContext ("var x;");
eval1("x = 'first context';");
eval2("x = 'second context';");
eval1("window.alert(x);");
eval2("window.alert(x);");
发布于 2019-09-15 18:18:05
就像派一样简单。
// Courtesy of Hypersoft-Systems: U.-S.-A.
function scopeEval(scope, script) {
return Function('"use strict";return (' + script + ')').bind(scope)();
}
scopeEval(document, 'alert(this)');
https://stackoverflow.com/questions/9781285
复制相似问题