2017-10-07 5 views

答えて

5

コードはvariable hoistingのため、以下のスニペットと同じです。つまり、opが1回宣言されますが、外側ループの繰り返しごとに#に初期化されます。

var op; 
for(index1 = 1 ;index1<8;index1++) 
{ 
    op = '#'; 
    for (index2 = index1; index2-1; index2--) 
    { 
     op = op + '#'; 

    } 
    console.log(op); 
} 
0

varを使用しているため、変数の有効範囲は関数スコープになります。

したがって、コンパイラ/インタプリタは、この変数をホイストと呼ばれるプロセスを通じて関数の先頭に移動します。

ブロックスコープを使用する場合は、varの代わりにletを使用してください。

コードletvarの場合、出力に違いはありません。

0

var variableは、囲み関数の先頭に作成されます。または、グローバルスコープ内にあるため、スクリプトがグローバルスコープで初期化されるときに作成されます。

外側のループ内では、基本的には#の割り当てで、以前の値を上書きします。

内部ループ内では、各反復の値に別の#を追加します。

varの代わりにlet variableを使用した場合、変数は外側のループのブロックにスコープされ、そのブロックの外側にはアクセスできません。

0

"変数 'op'は 'for'繰り返しで定義または初期化されるか、一度定義され、特定の値で毎回初期化されますか?

op変数は、すべての親のループの繰り返し(for (index1 = 1; index1 < 8; index1++) {...})で再度作成しますが、すべての子供forループのために、それが存在し、あなただけの子ループからその値を上書きします。

0

「変数 『OP』が定義とするたびに初期化されている」

「varが」パーサーの指示ではなく、実行時に実行したコマンドです。値がループの内側、ループの外側、またはその両方にvarとして宣言されているかどうかは違いありません。

は、私は変数は、ループの外で宣言された場合、それが読みやすくするために良いだろうと思うthis post

を参照してください。

この

scope 質問ここで

1

であるあなたの外側のループで反復ごとに値をインクリメントして#を記録しますスニペットです:

for (index1 = 1; index1 < 8; index1++) { 
 
    var op = '#'; 
 
    for (index2 = index1; index2 - 1; index2--) { 
 
    op = op + '#'; 
 
    } 
 
    console.log(op); 
 
}

は、理由を説明するには、それで、最初に、あなたのループを解剖しましょう:

for (index1 = 1; index1 < 8; index1++) { 
    var op = '#'; 
. . . 

この部分では、変数opを値#で作成しました。 7回反復すると、デフォルト値#に再インスタンス化されます。

しかし、なぜその変数は繰り返しごとにインクリメントされますか?のは、内部ループに移りましょう:この内側のループ内の各反復に対して

for (index2 = index1; index2 - 1; index2--) { 
    op = op + '#'; 
} 

、あなたがopのデフォルト値に追加#を追加しています。とにかく

、のは、内側のループが外側のループの各反復のために作っているどのように多くの反復を見てみましょう:

var x = 0; 
 

 
for (index1 = 1; index1 < 8; index1++) { 
 
    //var op = '#'; 
 
    for (index2 = index1; index2 - 1; index2--) { 
 
    //op = op + '#'; 
 
    x++; 
 
    } 
 
    console.log(x); 
 
    x = 0; 
 
    //console.log(op); 
 
}

あなたが見ることができるように、それはそれぞれの外側のループのために0, 1, 2, 3, 4, 5, 6反復を作っています繰り返し。つまり、最初の反復では、#が追加されず、2番目には#が追加されます。つまり、コード上の結果を正当化します。

# 
## 
### 
#### 
##### 
###### 
####### 

サイドノート:奇妙な何かに気づきましたか?正直なところ、私はこのループが非常に奇妙であることがわかります。しかし、私が正しいとすれば、それは0が偽であり、ループの第2のパラメータである反復を実行しないためです。私の推測が正しい場合は、コメントを追加してください。

とにかく、質問として投稿する必要があります。私はquestionからの回答を得ると、この回答を更新します。

EDIT:申し訳ありませんが、console.log(x)では7回の反復しかありませんでした。ループ状態の奇妙さについては、私の推測は正しいです。 index2 - 1は、index2 - 1 != 0以上、正確には!!(index2 - 1)と表記することもできます。 !!は何かをブール値に変換します。どれfalsey値はfalseになります:0null''空の文字列)、undefinedNaN、およびfalse。あなたの質問(くそ、私はほとんど奇妙なループのだって忘れてしまった)については

、バックのコードに行くことができます:

for (index1 = 1; index1 < 8; index1++) { 
 
    var op = '#'; 
 
    for (index2 = index1; index2 - 1; index2--) { 
 
    op = op + '#'; 
 
    } 
 
    //console.log(op); 
 
} 
 
//let's see if the variable resides outside the outer loop 
 

 
console.log(op);

多田!まだログは#######です。これは、クリステ氏が言ったような可変ホイストのためです。

+0

外ループforループは1から7まで繰り返され、出力は7ログになります。 –

+0

oh weird ..私は彼らが9人だと思いました。私はクロムデバッガでコードを試しました(私は簡単にインターネット接続を失った* coz)とそれは8回記録 –

関連する問題