2014-09-06 71 views
0

我遇到了一個JS範圍函數的問題,我正在爲codewars kata編寫一個函數。每當我只有兩個參數而不是3時,我的開始被輸入爲0而不是1.我發現這是因爲我的arguments.lenth == 1 if語句,但是根本不適用!這是我的範圍聲明:Javascript函數參數輸入爲0而不是1

function range(start, end, step) { 
    if(arguments.length<3) { 
    if(arguments.length==2) step=1; 
    if(arguments.length==1) end=start; start=0; step=1; 
    } 
    if(end < start) return []; 

    arr = []; 

    while(start < end) { 
    arr.push(start); 
    start+=step; 
    } 
    return arr;; 
} 

當我試着輸入:

range(1,11); 

我的範圍的開始變爲0,最終變成11,但是當我輸入:

range(1, 11, 1); 

你們能請你指點我正確的方向嗎?對於我的生活,我無法弄清楚它! 謝謝!

回答

3

由於我無法在評論中很好地格式化代碼,因此我會將其作爲答案。

下面是引擎是如何解釋你的代碼:

if(arguments.length<3) { 
    if(arguments.length==2) 
     step=1; 
    if(arguments.length==1) 
     end=start; 
    start=0; 
    step=1; 
} 

The syntax for an if statement is:

if (Expression) Statement 

所以你看,if聲明只接受單一聲明爲 「體」。

end=start;是一個表達式語句,因此它成爲if語句的「主體」。以下表達式語句(start=0; step=1;)與if語句處於相同的「級別」,並且僅在它之後執行。

如果你想if聲明的正文由多條語句,你必須使用一個block statement爲「體」,並把這些語句塊內。


語句/表達式之間的縮進和空白在JavaScript中沒有意義。

+1

這也是一個很好的例子,爲什麼用'if'語句總是使用大括號是一種更安全的編碼方式,因爲它可以防止這樣的意外錯誤。 – jfriend00 2014-09-06 04:58:39

1

我想你的意思是這樣的:

if(arguments.length==1) 
{ 
    end=start; start=0; step=1; 
} 

我喜歡垂直排列的大括號。