【发布时间】:2010-08-07 19:06:51
【问题描述】:
为什么您不能在 with 语句下使用 eval 访问作用域变量?
例如:
(function (obj) {
with (obj) {
console.log(a); // prints out obj.a
eval("console.log(a)"); // ReferenceError: a is not defined
}
})({ a: "hello" })
编辑:正如知识渊博的 CMS 所指出的,这似乎是一个浏览器错误(使用 WebKit 控制台的浏览器)。
如果有人想知道我试图想出什么可憎的东西,那将需要“邪恶”eval 和 with——我想看看我是否可以获得一个函数(用作回调)在另一个上下文中执行,而不是在它定义的那个上下文中执行。不,我可能(咳)不会在任何地方使用它......比什么都好奇。
(function (context,fn) {
with (context)
eval("("+fn+")()");
})({ a: "hello there" }, function () { console.log(a); })
【问题讨论】:
-
您在哪个浏览器中出现这种行为?您是否在某个控制台上运行代码?
-
@CMS:Chrome 5.0.375.125 beta 使用内置的开发者控制台。编辑:我刚刚用 Firefox (firebug) 尝试了这个,它按预期工作。一定是你说的浏览器错误。
-
@Daniel - 如果有帮助,它可以在 Chrome 6.0.472.22 中正常工作
-
@Nick,@Daniel,问题仅出现在控制台中我在 Chrome 6.0.472.25 上得到相同的行为,我很确定这个问题与 WebKit 控制台有关,因为它也可以在 Safari 5.0.1 和 WebKit Nightly 构建中重现
-
似乎也不限于
with语句。简单的情况:(function (a) { eval("console.log(a)"); })("hello")也失败了。我想我会提交问题,除非其他人愿意。
标签: javascript eval with-statement