簡単な答え: NO。JS は、宣言した回数に関係なく、すべての変数宣言をスコープの先頭に持ち上げます。
var i = 0
for (var i=0;i<10;i++)
{
var j = i%2;//declared 10 times, on each iteration
}
に翻訳されます
var i, j; //i is undefined at this point in the code.
for (i = 0;i<10;i++)
{
j = i%2;//declared 10 times, on each iteration
}
i
最初の例では、関数のスコープ内の変数として宣言しています。これは、グローバル スコープが乱雑になるのを避けるために行う必要があることです。これらの変数が使用するメモリは、関数が呼び出されたときに割り当てられ、関数が戻ったときに割り当てが解除されます (大まかに言うと、クロージャは例外を形成しますが、それにはかなり時間がかかります)。このことを考慮:
var i = 10;
function someF()
{
var i = 1;
alert(i);
}
someF();//alerts 1 <-- value of i, local to someF
alert(i);//10, global i is unchanged
しかし、あなたが省略した場合var
:
function someF()
{
i = 1;
alert(i);
}
1 が 2 回アラートされていることがわかります。JS が現在のスコープで変数宣言を見つけられない場合、var が見つかるまで上位のスコープを調べます。変数が見つからない場合、JS は最高のスコープ (グローバル) で変数を作成します。より詳細な例について暗黙のグローバルがどのように機能するかについての私の回答をここで確認するか、MDNページ、特に名前の競合に関するセクションを読んでください
最後に、グローバル、特に暗黙のグローバルは悪であることを付け加えたいと思います。また、ECMA6 標準は明らかにグローバル変数から離れており、真のブロック スコープのサポートを導入していることも知っておいてください。ここでわかるように
、ああ、関数が暗黙のグローバルを使用しているかどうかを確認したい場合:'use strict';
は素晴らしいことです:
(function()
{
'use strict';
var localVar = 123;//ok
impliedGlobal = 123;//TypeError!
}());
ご覧のとおり、暗黙のグローバルは許可されていません。完全な説明については、厳格モードの MDN を参照してください