5

だから私はいくつかのコードを持っているとしましょう:

//Javascript
var elements = [];
function addNumbah1(){
    var i = 1;
    elements.push(i);
}
function addNumbah2(){
    var i = 2;
    elements.push(i);
}

それは addNumbah999() まで続きますが、i変数を毎回宣言するのは悪い形式ですか? それは何かを壊しますか?私はすべきですか:

//Javascript
var elements = [];
var i
function addNumbah1(){
    i = 1;
    elements.push(i);
}
function addNumbah2(){
    i = 2;
    elements.push(i);
}
4

6 に答える 6

20

簡単な答え: 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 を参照してください

于 2012-11-29T16:46:16.530 に答える
0

グローバルを使用した 2 番目の形式はi、より高いスコープで定義されており、より高いスコープで定義された変数は解決に時間がかかるため、実際には少し遅くなる可能性があります。

パフォーマンスに関する考慮事項は別として、パフォーマンスが本当に問題にならない限り、一般的なガイドラインに従ってください。この場合:変数のスコープをできるだけ狭くします

最初のフォームを使用することを強くお勧めします。

于 2012-11-29T16:39:56.083 に答える
0

最初に行った方法で問題ありません。i の各インスタンスは、他の関数の他の i を認識しません。

グローバル変数とローカル変数に関するこのチュートリアルを読む必要があります

また、最適化を提案できますか。(数値ごとに個別の関数を使用するのではなく) 任意の数値をカバーするために次のことを実行できないのはなぜですか?

var elements = [];
function addNumbah(number){
    elements.push(number);
}
于 2012-11-29T16:40:55.940 に答える
0

変数を複数回宣言できます。コードでは、ここでさまざまなスコープで変数 i を宣言しています。

   //Here you are declaring variable i local to addNumbah1,2 functions 
   var elements = [];
   function addNumbah1(){
       var i = 1; 
       elements.push(i);
   }
   function addNumbah2(){
       var i = 2; 
       elements.push(i);
   } 


   //Here v /variable i has been declared globally
   var elements = [];
   var i
   function addNumbah1(){
       i = 1;   
       elements.push(i);
   }
   function addNumbah2(){
       i = 2;  
       elements.push(i);
   }

変数を複数回宣言することはできますが、アプリケーションでバグや問題が発生する可能性があるため、一般的には適切なプログラミング方法ではないことに注意してください。

于 2012-11-29T16:42:55.910 に答える
0

異なる関数で同じ名前の変数を宣言しても問題ありません。

于 2012-11-29T16:43:07.520 に答える
0

関数内で宣言された変数は、その関数のスコープ内にのみ存在するため、異なる関数間で同じ変数名を使用しても何も壊れません。

実際、変数をできるだけ小さなスコープに保持するのは良い形です! グローバル変数は管理が難しく、特に、別の関数がアクセスしようとしたときに、ある関数がその変数を使用して完了していない場合、非常に悪いバグが発生する可能性があります。

特に単純な変数の場合、宣言

var i = 0;

いつでも大丈夫です。

于 2012-11-29T16:54:21.973 に答える