6

私はJavaScriptが初めてです。

<html>
<body>
<script type="text/javascript">
var x=5;
document.write(x);
document.write("<br />");
var x;
document.write(x);
</script>
</body>
</html>

結果は次のとおりです。

5
5

x2 回目に宣言されると、未定義になるはずですが、以前の値が保持されます。この再宣言に特別な目的があるかどうかを説明してください。

4

9 に答える 9

21

あなたは実際に変数を再宣言していません。

JavaScript の変数ステートメントは巻き上げの対象となります。つまり、それらは解析時に評価され、実行時に割り当てが行われます。

解析フェーズの最後、実行前のコードは次のようになります。

var x;
x = 5;

document.write(x);
document.write("<br />");
document.write(x);
于 2009-12-08T01:38:39.057 に答える
7

var単独では割り当てを実行しません。これは、var発生するスコープ全体で変数名を使用する場合、グローバルではなくローカル変数について話していることを示すだけです(物議を醸すデフォルト)。var関数が解析されるときに発見され、そのスコープ全体で保持されるため、どこに置くかは関係ありません。

var a= 0;

function foo() {
    a= 1;
    return a;
    var a;
}

var b= foo();
alert('global a='+a+', local a='+b);

結果global a= 0, local a= 1varの実行中にステートメントに到達することはありませんが、ローカル変数のfoo()作成には効果的です。a

したがってvar x、同じスコープで2回目の宣言を行うことは、完全に冗長です。ただし、通常は同じ関数内で2回目の独立した使用のためにローカル変数名を再利用する場合は、それでも実行できる場合があります。最も一般的に:

for (var i= 0; i<onething.length; i++) {
    ...do some trivial loop...
}

for (var i= 0; i<anotherthing.length; i++) {
    ...do another trivial loop...
}

あなたは確かに2番目を省略することができますvar、そしてそのようなツールjslintはあなたにそうすることを要求するでしょうが、それは実際には良い考えではないかもしれません。

i後で最初のループを変更または削除して、がであると宣言されなくなったと想像してくださいvar。ここで、残りの2番目のループは、ローカル変数からグローバル変数に意味を突然変更します。最初のループを更新するときに、2番目のループがそれに隠れた依存関係を持っていることに気付かない場合(そして、目がパターンfor(...=0 ; ...<...; ...++)を「ああ、それは単なる標準のイテレーター」にどのように消去するかを考えると、気付かない可能性があります)。微妙で煩わしいデバッグの問題があります。

于 2009-12-08T01:59:38.117 に答える
1

そのため、宣言された x が未定義である必要がある 2 回目の場合

これは、仕様のどの部分に記載されていますか?

「未定義の動作」は「変数が」という意味ではありませんundefined

于 2009-12-08T01:32:31.390 に答える
0

また、プログラマーはvar変数をローカライズするために使用したい場合があります。

<script>
var x= 'this is global x';
function my_x() {
 var x= 'localized x';
 alert(x);
}
my_x();
alert(x);
</script>
于 2009-12-08T01:38:45.710 に答える
0

同じスコープ内で変数を再宣言しないでください。本当にこれを変更したい場合は、変数に代入してください。この動的言語で別のオブジェクトを作成するために再宣言は必要ありません。x を文字列にしたい場合は、以下を割り当てるだけです。

x = "hello";

undefined に戻すか、最初に再宣言する必要はありません。

変数の型を変更することは、ほとんどの状況であまり良い方法ではないことに注意してください。単に、それが必要な場合に可能であると述べているだけです。

于 2009-12-08T01:39:27.590 に答える
0

私のJavaScriptの理解に関する限り、グローバルスコープでvarはキーワードの使用は完全にオプションです。関数については別の話です。

関数内では、varキーワードを使用して、変数が関数に対してローカルであることを示します (デフォルトでグローバルであるのとは対照的です)。

私は個人的varにグローバルスコープで使用して、変数が初めて宣言および/または使用されていることを示します。

詳細については、 http://www.w3schools.com/js/js_variables.aspを参照してください。

于 2009-12-08T01:32:02.670 に答える
0

その 2 番目の var x はまったく不要です。

于 2009-12-08T01:32:45.927 に答える
0

同じスコープ内では、変数を「再宣言」する必要はまったくありません。

于 2009-12-08T01:34:13.770 に答える