2015-10-15 66 views
2
function a() { 
    var n1 = 0, 
     n2 = 0; 
    for (; n1 < 100; n1++) { 
     for (; n2 < 100; n2++) { 
      console.log(2); 
     } 
     console.log(1); 
    } 
} 
a(); 

function b() { 
    for (var n1 = 0; n1 < 100; n1++) { 
     for (var n2 = 0; n2 < 100; n2++) { 
      console.log(2); 
     } 
     console.log(1); 
    } 
} 
b(); 

正如你可以看到的。兩個簡單的嵌套循環,它看起來像他們將有相同的輸出。但令我感到困惑的是函數a()不會輸出預期的結果,它循環外部和內部100次。有什麼不同?javascript中兩個嵌套循環之間有什麼區別?

+0

在'函數了'變量'n2'在開始進行初始化,它reseted到0後從未當你重置'在B(n2')加班你進入你的第二個循環 –

回答

4

在你b()功能n2變量爲 創建 (見@ jfriend00評論)a循環迭代期間復位。它設置爲0,因此b循環遍歷整個長度(100次)。

a可變n1在內循環之前創建一次,所以第一a迭代(和100 b)後,n2具有100在第二a互爲作用n2的值,如果它小於100。這是被檢查不,所以內循環在它開始之前就結束了。

在()N2
+3

不非常正確。由於變量提升,n2變量僅創建***一次。行爲上的差異是因爲在第二種情況下'n1'循環中'n2'被重置爲'0'。 – jfriend00

+0

你是對的 - 我編輯了我的答案。 – slomek

2

只inited一次,但在B()inited每次N1改變

3

首先,讓我們明確了變量聲明 - 提升和功能範圍意味着這兩個功能是這個樣子

function a() { 
    var n1; 
    var n2; 
    n1 = 0; 
    n2 = 0; 
    for (; n1 < 100; n1++) { 
    for (; n2 < 100; n2++) { 
     console.log(2); 
    } 
    console.log(1); 
    } 
} 
a(); 

function b() { 
    var n1; 
    var n2; 
    for (n1 = 0; n1 < 100; n1++) { 
    for (n2 = 0; n2 < 100; n2++) { 
     console.log(2); 
    } 
    console.log(1); 
    } 
} 
b(); 

現在它應該更加明顯 - 函數b在每個for循環的開始將n2設置爲零,函數a不會。如果這種行爲讓你感到意外,那麼在JavaScript中閱讀更多關於函數範圍的知識。

Variable Scope

相關問題