2

有没有办法在 Javascript中引用作用域链上的下一个对象?

因此,例如:

var a = 12;
function run() {
  var a = 34;
  alert( a ); //replace "a" with something like "parent.a" so it shows 12 instead of 34
}
run();
4

6 回答 6

3

不,没有。Javascript 并没有真正暴露作用域链(令我懊恼的是;我希望能够编写一个将变量添加到本地作用域的函数,但可惜我不能)。

于 2012-07-17T22:39:36.897 回答
1

最简洁的答案是不。JS 有闭包可以让你“保存”作用域状态,但这不一样。你可以在这里阅读:JavaScript 闭包是如何工作的?

于 2012-07-17T22:43:32.900 回答
0

您可以使用这个技巧,将内部a变量作为伪静态属性分配给run函数:

var a = 12;
function run() {
  run.a = 34; //or arguments.callee.a = 34
  alert( a );
}
run(); //=> 12

如果第一个a是浏览器中的全局变量,这也是一种可能:

var a = 12;
function run() {
  var a = 34; //or arguments.callee.a = 34
  alert( window.a ); //global variables are a property of window
}
run(); //=> 12
于 2012-07-17T22:57:16.400 回答
0

其他答案是正确的,但您应该知道 ECMA-262 明确指出“范围”对象(即lexical environment)不能被脚本直接引用或修改。唯一的例外是全局变量是全局(与浏览器中的窗口同义)对象的属性。

词法环境和环境记录值纯粹是规范机制,不需要对应于 ECMAScript 实现的任何特定工件。ECMAScript 程序不可能直接访问或操作这些值。

ECMA5 §10.2

于 2012-07-18T02:03:35.497 回答
0

也许它有帮助,至少你可以在上下文的内部范围内插入一个后门:

function Foo() {
    var a = 123; // much private
    this.b = 456; // much public
    this.eval = function(code) { return eval(code) } // backdoor to inner scope
}
foo = new Foo()
console.log("foo.eval(\"a\": ", foo.eval("a")) // 123
console.log("foo.eval(\"b\": ", foo.eval("b")) // ReferenceError: b is not defined
console.log("foo.eval(\"this.b\": ", foo.eval("this.b")) // 456
console.log("foo.a:", foo.a) // undefined
console.log("foo.b", foo.b) // 456
于 2015-05-20T16:25:13.833 回答
0

我认为您正在寻找的解决方案是:

var a = 12;
function run() {

   var a = 34;
   alert(window.a); 

  /*accesses the global window object to which any variable 
      in the global scope gets binded*/
}
run();
于 2016-05-28T18:22:38.200 回答