【问题标题】:Rhino JavaScript and dynamic scope var creationRhino JavaScript 和动态范围 var 创建
【发布时间】:2010-02-04 23:52:09
【问题描述】:

我正在尝试在 Rhino JavaScript 的函数中定义一个动态变量(特别是嵌入在 Java 6 中的),但我不想求助于 eval,也不想通过引用它这个。基本上,我想获取一个对象,并将每个属性转换为函数范围内的 var ......类似于:

var abc = "value";
var context = { abc: 123, xyz: "def" };

function test(cx) {
  for (var p in cx) {
    this_scope[p] = cx[p];
  }

  println(abc);
  // DON'T WANT TO HAVE TO DO THIS:
  // pritnln(this.abc);
}

test(context); // prints: 123
println(abc); // prints: value

信不信由你,如果我必须使用“this”,这很重要。 (它是一个动态生成的函数,我想用不同的上下文对象一遍又一遍地调用它,并且对每个变量使用“this”将是非常有害的)。

我还想避免获取新的引擎上下文或类似的东西...如果我可以直接在 JavaScript 中执行此操作,那就太棒了(我认为结果会明显更快)。

【问题讨论】:

  • 这真的是标题所暗示的动态作用域,还是完全不同的东西?对我来说,动态范围意味着引用调用者的环境绑定。它是动态的,因为绑定的内容取决于程序执行流程。为静态范围中已经可见的名称创建简写名称似乎是另一回事。

标签: javascript dynamic rhino


【解决方案1】:

所以,基本上你想要像 JS 的 with 这样工作的东西? *咧嘴笑,鸭子,然后奔跑*

var abc = "value";
var context = {abc: 123, xyz: "def"};

function test(cx) {
    with (cx) {
        println(abc);
    }
}

test(context);
println(abc);

请注意,一些知名的 JS 从业者,例如 Doug Crockford,strongly deprecate the use of with

【讨论】:

  • 这正是我要找的……(我现在感觉很蠢)
  • 一定要考虑到with的不好的方面,即设置一个在当前作用域上不存在的属性,不在当前with作用域上设置它,它设置在全球范围内。 jsfiddle.net/EJM6X
  • +1 表示在建议使用with咧嘴、躲避和奔跑
猜你喜欢
  • 2018-12-22
  • 1970-01-01
  • 1970-01-01
  • 2014-12-16
  • 2013-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多