强制在JS中提升范围链

时间:2012-07-17 22:35:38

标签: javascript scope-chain

有没有办法在Javascript中引用下一个对象up the scope chain

所以,例如:

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();

6 个答案:

答案 0 :(得分:3)

不,没有。 Javascript根本没有暴露范围链(很多我的懊恼;我很想能够编写一个向本地范围添加变量的函数,但我不能)。

答案 1 :(得分:1)

简短的回答是否定的。 JS有闭包,可以“保存”范围状态,但这不一样。你可以在这里阅读:How do JavaScript closures work?

答案 2 :(得分: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

答案 3 :(得分:0)

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

  

词汇环境和环境记录值纯粹   规范机制并不需要对应任何具体的   ECMAScript实现的人工制品。这是不可能的   ECMAScript程序直接访问或操纵这些值。

     

ECMA5 §10.2

答案 4 :(得分: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

答案 5 :(得分:0)

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

{{1}}