2012-07-17 88 views
2

是否有引用的下一個對象up the scope chain在Javascript的方法嗎?力向上移動範圍鏈JS

因此,舉例來說:

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

據我所知,它是不可能的。 – c69 2012-07-17 22:38:40

+0

聽起來像是一個讓人困惑的配方,它有可能。 – 2012-07-17 22:43:03

+0

@LeeTaylor毫無疑問,我只是想知道是否有可能。孩子們,不要在家裏這樣做! – cambraca 2012-07-17 22:43:47

回答

3

不,沒有。 Javascript並沒有真正暴露範圍鏈(很讓我懊惱;我很想寫一個函數,它將變量添加到本地範圍,但是我不能)。

+0

防止訪問詞法環境意味着您不能將其用作數據存儲,並且您必須使用對象來存儲數據,這對於JavaScript來說幾乎總是一個更好的解決方案。 – RobG 2012-07-18 02:06:35

1

簡短的回答是否定的。 JS有閉包,可以讓你「保存」範圍狀態,但這不一樣。你可以讀到這裏:How do JavaScript closures work?

+0

我不想用這個做任何實際的事情。只是好奇JS。 – cambraca 2012-07-17 22:44:41

+0

我明白了。你可能會覺得這很有趣:http://stackoverflow.com/questions/111102/how-do-javascript-closures-work但是,改變範圍,訪問父母是不可能在JS .. – valentinas 2012-07-17 22:47:45

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 
0

其他的答案是正確的,但你應該知道,ECMA-262明確規定,「範圍」對象(即lexical environment)不能被腳本直接引用或修改。唯一的例外是全局變量被作爲全局(與瀏覽器中的窗口同義)對象的屬性。

詞法環境和環境記錄值是純粹的 規範機制,不需要與任何特定 假象的ECMAScript實現的。 ECMAScript程序不可能直接訪問或操作這些值。

ECMA5 §10.2

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