0

私はJavascriptで変数のスコープを勉強していて、変数の宣言と変数の初期化の違いに出くわしました。私が知っている開発者と話すことから、変数宣言の前に書くvarと変数がローカルスコープに割り当てられ、変数をvar宣言する前に書くと変数がグローバルスコープに割り当てられるというのが私の理解です。これは本当ですか?

変数を宣言する前に var を書き込むと変数がローカル スコープに割り当てられる場合、var後で変数を初期化してローカル スコープに保持するときに書き込む必要がありますか? 例えば:

var someVariable;
// Do some things with JavaScript
someVariable = 'Some Value'

someVariableを使用してローカル スコープで宣言し、その後を使用せずvarに初期化したため、JavaScript は、ローカル スコープで 1 つの変数を初期化しただけだと思いますか、それともローカル スコープで 1 つの変数を宣言してから、グローバルで別の変数を宣言して初期化したと思いますか?範囲?someVariablevar

後で再度値を変更したい場合someVariable、変数式の前に var を記述する必要がありますか?それとも、すでに宣言されているローカル変数の値を変更していることを JavaScript が認識しますか? 技術的に言えば、すでに宣言されているローカル変数の値を変更しているとき、およびグローバル変数を宣言して初期化しているとき、JavaScript はどのようにしてそれを知るのでしょうか?

4

4 に答える 4

3
var something = "Initial value."

これは、「ローカルスコープで変数を作成し、それに初期値を与える」ことを意味します。ローカル スコープは、このステートメントを使用する関数を意味します。

something = "New value."

これは、「最も近いスコープで変数 'something' を見つけ、それに新しい値を割り当てる」ことを意味します。最初のステートメントを使用せずに 2 番目のステートメントを使用すると、ステートメントはsomething次第に大きなスコープ (存在する場合は関数を含む関数、それを含む関数など) で定義を検索し、グローバルに到達するまで範囲)。何かが見つかった場合は、既存の変数に代入します。何も見つからない場合は、その名前でグローバル変数を作成します。

最初に使用varすると、この検索が常にローカル スコープで停止するようになります。

于 2013-02-27T20:45:53.373 に答える
2

これらは同じです:

var x;
// ...
x = 1;

...と...

var x = 1;

どちらもローカルスコープで変数を定義し、それに値を割り当てます。同じスコープ内で後で変数の値を変更したい場合は、単に名前で参照できます。

x = 2;

ただし、別のスコープにいる場合は、変数が最初にグローバル スコープで宣言されていない限り、アクセスできません (「スコープ外」です)。そうしようとすると、グローバル スコープでその名前の変数が定義されます。

function a(){
    var x = 1;
}

function b(){
    x = 2;  // 'x' in a is out of scope, doing this declares a new 'x' in global scope
}

a();
b();

宣言されたのと同じスコープ内の変数を参照する場合、次のことはできますが、プレフィックスを付ける必要はありませんvar

var x = 1;
// ...
var x = 2;

……その必要はない。'x' に 2 を割り当てますが、var は既にローカル スコープにあるため、論理的には何の効果もありません。xただし、グローバルに宣言されていた場合:

var x = 1;

function a(){
    var x = 2;
    console.log(x);
}

a();
console.log(x);

これにより、最初に「2」が出力され、次に「1」が出力されます。x関数内で先行する withを参照varすることで、ローカル スコープを変数に適用します。関数が完了すると、変数の元のスコープが復元されます (または、そのように見たい場合は、再スコープが失われます)。これを指摘してくれた@zzzzBovに感謝します。

お役に立てれば。

于 2013-02-27T20:42:53.790 に答える
2

私の理解では、変数宣言の前に var を記述すると変数がローカル スコープに割り当てられますが、変数を宣言する前に var を記述しないと変数がグローバル スコープに割り当てられます。これは本当ですか?

完全ではありません。

function foo() {
    var a = 1;
    function bar() {
        a = 2; // Still in the scope of foo, not a global
    }
}

var を使用してローカル スコープで someVariable を宣言した後、var を使用せずに someVariable を初期化したので、JavaScript は、ローカル スコープで 1 つの変数を初期化しただけだと思いますか、それともローカル スコープで 1 つの変数を宣言してから、別の変数を宣言して初期化したと思いますか?グローバルスコープの変数?

その例には 1 つしかありませんsomeVariable

後でまた someVariable の値を変更したい場合、変数式の前に var を書く必要がありますか?

var関数内のどこに表示されても、関数全体の変数をスコープします。

于 2013-02-27T20:46:05.530 に答える
0

を使用して変数を定義すると、キーワードを何度varも使用せずに同じ変数を参照できます。varこれらは同じ変数を参照します。

var someVariable;
//...code...
someVariable = 'rawr';

var変数を変更するたびにキーワードを使用した場合、個別の変数は取得されません。最新の宣言は、最も古い宣言を上書きするだけです。したがってvar、初期化以外でキーワードを使用しても意味がありません。の値を変更するsomeVariableには、上記の例のように変数名に代入するだけです。

基本的に、varそのスコープに同じ名前の変数がない場合、 using は新しい変数を作成します。

たとえば、次のコードを使用します。

var someVariable = 'initialized';

function test1(){
  //this someVariable will be a new variable since we have the var keyword and its in a different scope
  var someVariable = 'test1';
  console.log(someVariable);
}

function test2(){
  //because there is no var keyword this refers to the someVariable in the parent scope
  someVariable = 'test2';
  console.log(someVariable);
}

console.log(someVariable); //initialized

test1(); //test1
console.log(someVariable); //initialized

test2(); //test2
console.log(someVariable); //test2

この例では、コードで実行したい内容によっては、問題が発生する可能性があることがわかります。test2のように振る舞いたいのにキーワードtest1を使用するのを忘れた場合、期待してvarいたときに混乱し、代わりに.someVariableinitializedtest2

ただし、親変数を更新するために、意図的にvarキーワードを使用しないこともできます。したがって、キーワードを正しくtest2使用することが重要です。var

変数を初期化するときに使用しないvarと、グローバル スコープで変数が作成されます。これは良い習慣ではありません。グローバルスコープに変数が必要な場合は、手動でそこに配置してください。つまりwindow.someVariable = 'initialize';、あなたのコードを見た他の人は、意図的にそれをグローバル変数にしたことを知ることができます。

于 2013-02-27T21:16:47.553 に答える