4

ほとんどすべてのJavaScriptの本はそれを言った

varがないと、変数はグローバル変数として宣言されるため、変数を宣言するときは常にvarキーワードを使用してください。

次に、varキーワードを削除し、ローカルスコープとしてデフォルトの宣言を作成しませんか?Pythonのように、グローバル変数を使用する場合は、次のように記述します。

global foo;

ほとんどの場合、ローカル変数を使用しますね。正当な理由はありますか?助けてくれてありがとう。


編集:すべてのあなたの助けに感謝します、私はvarを使用する方が良いことを示す正当な理由があるに違いないと思ったので、私はそれがどのような言語であるかを変更しようとしませんでした。

4

5 に答える 5

6
var globalInt = 5;

function Hello()
{
    // Hey, give me back my var keyword!
    // I want to assign a global existing variable
    globalInt = 7; 
}

もう1つのポイントは、JavaScriptから何かを削除する簡単な方法がないことです。すべての機能(ハックも)はすでに何千ものサイトで使用されており、機能を削除するとそれらのサイトが壊れます。JavaScriptは拡張のみ可能です。または、以前のバージョンと互換性のない新しいJSを作成する必要があります。

于 2011-03-20T11:45:55.537 に答える
4
function A() {
    var foo; // variable in the scope of function A
    function B() {
        foo; // variable still in the scope of function A
    }
} 

「最も狭いスコープ」または「グローバルスコープ」を選択した場合、これは不可能です。

于 2011-03-20T11:52:10.863 に答える
3

これはまさに言語が設計された方法です。変数が自動割り当てされる場合、その変数はグローバルスコープに割り当てられます。

あなたがそれについて考えるならば、それは非常に理にかなっています。変数はどのスコープに割り当てる必要がありますか?コンパイラーには、明示的な宣言でプログラマーの目標を知る方法がありません。

良くも悪くも、JSはそのように設計されました。変数の自動宣言を許可するのは間違いだったと思いますが、JSに存在することを考えると、JSにはブロックレベルのスコープがないため、変数をグローバルにするのは理にかなっています。

于 2011-03-20T11:46:28.350 に答える
1

関数内でvarキーワードを使用すると、ローカルスコープで変数が宣言されるため、グローバル変数の上書きが防止されます。アイデアは安全にプレイし、varを使用することです。何をしているのかがわかっている場合(グローバル変数を上書きしないことを100%確信している場合)、varを自由に破棄してください。

于 2011-03-20T11:49:19.300 に答える
1

OK、それがどのように機能するかをもう一度説明しようと思います。Global他のすべての「ルート」であるECMAScriptのオブジェクトがあります。ブラウザでは、windowオブジェクトはを実装しGlobalます。それで:

function assert( condition, message ) {
  if ( !condition ) 
      if ( typeof message != 'undefined' ) alert( message ); 
      else alert( 'Free Consulting just talks rubbish' );
}

// assuming global scope
assert( this == window, 'noes!' ); // and Global context

var spam = 'for all you python lovers'; // becomes a property of Global
assert( spam == window.spam, 'there not much spam in it' ); // same

function eggs () { // becomes a method of Global actually
  assert( spam == window.spam, 'shut up!' ); // unqualified spam available here through closure
  assert( arguments.callee == window.eggs ); // and again
}
eggs();

結論夫人:JavaScriptは独自の特性を持つ別個の言語であるため、他の言語の知識をJSに適用しないでください(ダグラス・クロックフォードは悲しいパンダになります:)

于 2011-03-20T13:09:43.027 に答える