16

JavaScriptのグローバルスコープと関数スコープの違いについての投稿をたくさん見てきましたが、ここにリンクするには多すぎます。私はPythonについて尋ねられた私の正確な質問も見ました。だから私が知りたいのは、「より近い」スコープにも同じ名前の変数がある場合、どうすればグローバル変数にアクセスできるのかということです。

var a = "global";
function b(){
  var a = "local";
  var magic = ...; // somehow put "global" in magic
  console.log(magic); // should print "global"
}

ブラウザのみwindow.aで、グローバルを指定するために使用できることがわかりました。サーバーサイドでも機能するものはありますか?

4

5 に答える 5

12

それが本当にグローバルである場合(つまり、外部スコープだけでなく)、これを行うことができます:

var magic = (function(name){return this[name]}).call(null, "a");

ECMAScriptのドキュメント(10.4.3)から

機能コードの入力

次の手順は、制御が関数オブジェクトFに含まれる関数コードの実行コンテキストに入るときに実行されます。呼び出し元はthisArgを提供し、呼び出し元はargumentsListを提供します。

関数コードが厳密なコードである場合は、ThisBindingをthisArgに設定します。それ以外の場合、thisArgがnullまたは未定義の場合は、ThisBindingをグローバルオブジェクトに設定します。

グローバルスコープはaを定義する場所ではないため、jsFiddleでこれをテストできないことに注意してください。

デモンストレーション

var a = "global";

function b(){
  var a = "local";
  var magic = (function(name){return this[name]}).call(null, "a");
  document.body.textContent = 'a: '+JSON.stringify(magic); // print "global"
}

b();

于 2012-09-20T15:13:20.123 に答える
3

それを行うための基準はありません。私自身の目的のために、私は常に変数をプロジェクト名に似た名前のコンテナーに入れます。

var PROJECT = {}; //「プロジェクト」のすべての「グローバル」をこのコンテナに入れます

そうすれば、すべての変数を1つの場所に集めることができ、「グローバル」を渡す必要がある場合は、最大で1つの参照を渡す必要があります。

于 2012-09-20T15:12:45.677 に答える
2

答えの基礎としてコードを使用すると、以下を使用aして、ローカルバージョンではなくグローバルバージョンの「」を実際にプルできます。

var a = "global";
function b(){
  var a = "local";
  var magic = this.a; // somehow put "global" in magic
  console.log(magic); // should print "global"
}
b();

これは、上記の形式でb()関数を呼び出している場合にのみ機能します。これが機能しない例は次のとおりです。

var a = "global";
function b(){
  var a = "local";
  var magic = this.a; // somehow put "global" in magic
  console.log(magic); // should print "global"
}
b.call({a : "other context"});

上記の場合"other context"、コンソールに出力されます。

于 2013-02-25T22:26:44.803 に答える
1

グローバルオブジェクトを介してグローバルにアクセスできます。この場合、ウィンドウと現在のコンテキスト内の名前によるローカル。

これはフィドルの例です。

于 2012-09-20T15:17:24.463 に答える
0

直接的な答えはありませんが、回避策は、確立されたコンテナ、たとえばウィンドウを使用することです。

window['a'] = "global";

これはあまりクリーンなソリューションではありませんが、機能します

于 2012-09-20T15:14:59.683 に答える