【问题标题】:Difference between window[] and eval() - Javascriptwindow[] 和 eval() 之间的区别 - Javascript
【发布时间】:2026-02-05 20:40:01
【问题描述】:

我一直在 javascript 中使用这两者...真的不知道有什么区别。谷歌搜索总是显示“window object”或“opening a new window in javascript”的结果,所以在那里找不到任何东西。

 eval("v"+e)
 window["v"+e]

有时 window 对我有用,而在其他时候 eval 对我有用 ....

那么 eval() 和 window[] 有什么区别呢?

对不起,新手问题!

诺曼

【问题讨论】:

  • 您能把这个问题说成是一个问题吗?具体来说,您真正要问的是什么?
  • 无论答案如何,都不要使用 eval!
  • 我认为问题是“请向我解释一下情况”这一点很清楚。
  • @jasongetsdown - 小问题......为什么不应该使用 eval ?有没有更好的方法来访问像这样的局部变量 var c = eval("ev"+d);其中 d=1 本地(此值传递给函数),我想将 c 的值设置为等于本地变量 ev1 的值?
  • @Norman:答案是,如果您是新手并使用eval,您可能做错了什么。 Eval 确实有一个目的,但新手可能不会为此使用它。 (这是最近提出的一个老问题,所以这个问题是为其他人准备的)

标签: javascript


【解决方案1】:

还有一点没有解决的是eval会使用调用者变量环境解析变量引用,例如:

var foo = "global";

(function () {
  var foo = "local";
  alert(eval("foo")); // alerts "local"
  alert(window["foo"]); // alerts "global"
})();

如你所见,不完全等价。

如果您只是想引用一个全局变量,我建议您使用window[prop] 方法并避免意外。

【讨论】:

  • 所以为了访问局部变量使用 window 否则使用 eval ? ...为什么这么多人不鼓励使用 eval?是否有另一种访问局部变量的方法,例如 eval("ev"+d);其中 d=1 本地,我想访问本地变量 ev1 的值?
  • @Norman,要访问全局变量,请使用 window[prop],请参阅 this question 了解为什么在不需要时不应该使用 eval..
【解决方案2】:

eval() 解释任意 javascript 语句,而使用 window 您正在访问窗口对象的属性。

在您的示例中,您似乎在 eval() 和 window[] 中都使用了属性名称。由于浏览器中的全局作用域与窗口对象的作用域相同,因此它们的求值结果相同。

您可以将您的eval("v"+e) 语句视为等同于eval("window['v'" + e +" ]")

【讨论】:

  • 说得好。但是要确保它清楚 - eval 是不好的方法;另一个是这样做的好方法。
  • 是的,eval 几乎总是一个坏主意。
【解决方案3】:

两者都返回一个全局变量的值。不同之处在于,如果全局变量未定义,则执行 eval() 时会出错,而 window['variableName'] 将返回 undefined(不是错误),因为访问未定义的属性不是错误,而是访问未定义的变量是一个错误。

【讨论】:

    【解决方案4】:

    "v"+e -> 字符串

    eval(x) -> 计算字符串 x,包含 javascript 表达式

    window[x] -> 返回具有相同名称的窗口属性,就像 x 的值一样。这实际上可以是一个全局变量

    因此,当您有一个全局变量v1 = "foo"e = 1,那么eval("v"+e)window["v" + e] 都返回“foo”

    【讨论】: