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

少なくとも、コンテキストの内部スコープにバックドアを挿入できます。

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

他の答えは正しいですが、ECMA-262 では、「スコープ」オブジェクト (つまり、レキシカル環境) をスクリプトで直接参照または変更できないことが明示的に述べられていることを知っておく必要があります。唯一の例外は、グローバル変数がグローバル (ブラウザのウィンドウと同義) オブジェクトのプロパティになることです。

レキシカル環境と環境レコードの値は純粋に仕様メカニズムであり、ECMAScript 実装の特定のアーティファクトに対応する必要はありません。ECMAScript プログラムがそのような値に直接アクセスしたり操作したりすることは不可能です。

ECMA5 §10.2

于 2012-07-18T02:03:35.497 に答える
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 に答える