首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在JavaScript中指定eval()的作用域吗?

在JavaScript中指定eval()的作用域吗?
EN

Stack Overflow用户
提问于 2012-03-20 12:18:42
回答 11查看 25.3K关注 0票数 26

有没有办法在一个特定的作用域(而不是全局的)上执行eval

例如,以下代码无法工作(第二条语句中未定义a),因为它们在不同的作用域中:

代码语言:javascript
复制
eval(var a = 1); 
eval(alert(a));

如果可能的话,我想即时创建一个作用域。例如(语法肯定是错误的,但只是为了说明想法)

代码语言:javascript
复制
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
}

有没有关于如何实现这样的事情的想法?谢谢!

EN

回答 11

Stack Overflow用户

发布于 2012-03-20 12:20:40

您可以使用"use strict"将eval代码包含在eval本身中。

其次,严格模式代码的eval不会将新变量引入到周围的作用域中。在普通代码中,eval("var x;")会在周围的函数或全局作用域中引入一个变量x。这意味着,一般来说,在包含对eval的调用的函数中,每个没有引用参数或局部变量的名称都必须在运行时映射到特定的定义(因为该eval可能引入了一个隐藏外部变量的新变量)。在严格模式下,eval仅为要计算的代码创建变量,因此eval不会影响名称是引用外部变量还是某些局部变量

代码语言:javascript
复制
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",那么其中的所有内容都将在严格模式下执行。下面的代码将执行与上面相同的操作:

代码语言:javascript
复制
function foo(){
    "use strict";

     var x = 17;
     var evalX = eval("var x = 42; x");
     assert(x === 17);
     assert(evalX === 42);
}
票数 20
EN

Stack Overflow用户

发布于 2016-10-27 00:53:14

将您希望在作用域中存在的变量创建为函数中的局部变量。然后,从该函数返回一个本地定义的函数,该函数只有一个参数,并对其调用eval。该eval实例将使用其包含函数的作用域,该作用域嵌套在顶级函数的作用域中。每次调用顶级函数都会使用eval函数的新实例创建一个新的作用域。为了保持所有内容的动态性,您甚至可以在顶级函数中使用对eval的调用来声明该作用域的局部变量。

示例代码:

代码语言:javascript
复制
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);");

https://jsfiddle.net/zgs73ret/

票数 11
EN

Stack Overflow用户

发布于 2019-09-15 18:18:05

就像派一样简单。

代码语言:javascript
复制
// Courtesy of Hypersoft-Systems: U.-S.-A.
function scopeEval(scope, script) {
  return Function('"use strict";return (' + script + ')').bind(scope)();
}

scopeEval(document, 'alert(this)');

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9781285

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档