【问题标题】:JavaScript: execute code in a specific contextJavaScript:在特定上下文中执行代码
【发布时间】:2010-12-01 03:04:54
【问题描述】:

如何在特定的上下文中执行 JavaScript 函数/一段代码,它会被视为全局上下文?这与更改此(调用/应用)不同,这更像是更改“窗口”。

基本上,如果我有以下代码:

(function() { x.value = 5; return value; })()

有没有办法让它工作(返回 5)而不改变代码本身?

另外,在 x 的上下文中执行代码(如果可能)是我的第一个想法,但也许还有其他解决方案?

更新:

原始问题:我正在尝试使用 selenium 测试书签。 Bookmarklet 假设它可以做

window.SomeObject = {...}; SomeObject.doSomething();

我从页面获取小书签并使用 $selenium.get_eval 执行它,并且在 get_eval 全局对象的上下文中是 selenium 本身的某个对象,而不是窗口。 window.SomeObject 仍然有效,因为 selenium 上下文有窗口,但只是 SomeObject 不起作用。

我想我知道另一种可能的解决方案,但我想知道原始问题是否有答案。

更新 2(解决方案):

最终解决方案(基于 geowa4 的回答):

x = {}; with(x) { return (function() { x.value = 5; return value; })(); }

【问题讨论】:

  • 你能解释一下你到底想做什么吗?
  • 首先,您设置了x.value,但只返回value,所以您的代码不会“返回5”。其次,什么?
  • 在文章末尾添加了解释
  • @crescentfresh 如果 x === 窗口,例如(在普通浏览器上下文中),它会这样做

标签: javascript selenium scope


【解决方案1】:

您可以使用 with 关键字更改范围。

(function() { x.value = 5; with(x) { return value; })();

with 关键字将代码块的范围限定为给定对象。因此,在这种情况下,您将返回 5。

【讨论】:

  • @crescentfresh:是的,但那是不可能的,所以我选择了最接近的选项。在黑暗中有点刺。
  • 我在问题中添加了更多细节。 With 是一个非常好的主意,但它会在外部范围内工作吗?我会检查的。
  • 你统治。 x = {}; with(x) { var result = (function() { x.value = 5; 返回值; })();警报(结果); } 完美运行!
猜你喜欢
  • 2019-01-16
  • 1970-01-01
  • 1970-01-01
  • 2014-07-30
  • 1970-01-01
  • 1970-01-01
  • 2016-11-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多