2014-02-18 72 views
0

我一直在javascript中使用return語句。這是msdn definitionreturn語句是從內部工作到外部工作的嗎?

下面是我寫的一個二進制數轉換爲十進制數的函數:

function bin2dec(num){ 
    **return** num.toString().split('').reverse().reduce(function(preVal, currentVal , iterator){ 
     **return** (currentVal === '1') ? preVal + Math.pow(2, iterator) : preVal; 
    }, 0); 
    } 

讓我們用5二進制作爲一個例子與Binary5 = 101

所以工作我認爲,無論何時使用return語句,它都會過早地退出當前函數。

這裏我有兩個返回語句,一個在回調函數中。

第一個return語句是在第二行:

return num.toString().split('').reverse() // and then the reduce function w/ a call back. 

我相信這個「​​return」語句正在等待減少函數的返回

該函數的數量,使得一個字符串,然後分割,然後反轉,然後reduce方法遍歷數組。當reduce函數完成時,它返回一個值,然後返回第一個返回值。這裏是關於reduce函數返回值的更多細節。

在回調:

// 101 
    .reduce(function(preVal, currentVal , iterator){ 
      return (currentVal === '1') ? preVal + Math.pow(2, iterator) : preVal; 
     }, 0); 

它的陣列中的每個部分遍歷,在這種情況下,「返回」是普雷瓦爾除非 currentVal === 1.「返回」值被傳遞給回調並且是preVal的值。對於每個循環,我們將添加並建立在來自pre val的當前val上。當數組中的每個項目都迭代時,return語句就是最終的值。最終的值然後從尚未執行的第一個return語句返回。

我真的迷失在回報聲明有時。我主要試圖檢查我的邏輯在'返回'陳述如何以我描述的方式行事。對於一個快速回顧

  1. 首先返回 - 等待一切進行評價,有一個 對象返回。

  2. 第二回 - 用於回調,當它完成 迭代,則返回最後一個返回值,則該值是 從最終爆發的功能 第一return語句採取行動。

回答

1

讓我們看看how the return statement is defined

return [no LineTerminator here] Expression ; 

和被評價爲

如果省略表達,返回值是undefined。否則,返回值是表達式的值。

你看,沒有關於其他返回語句的字。 任何表達式在返回語句中是有效的,並不重要什麼表達式正是。


後續問題是什麼num.toString().split('').reverse().reduce(...)究竟是什麼,以及如何評估它。

num.toString().split('').reverse().reduce(...)調用表達式並且此表達式的結果是函數的返回值。

那麼reduce如何工作? reduce將數組轉換爲單個值。它通過爲數組中的每個元素執行一個函數,並將前一次迭代函數的返回值傳遞給下一次迭代來實現。


因此,底線是,這兩個return聲明沒有任何與對方,他們是完全獨立的。如果您事先定義了功能,可能會比較容易:

function bin2dec(num){ 
    function callback(preVal, currentVal , iterator){ 
    return (currentVal === '1') ? preVal + Math.pow(2, iterator) : preVal; 
    } 
    return num.toString().split('').reverse().reduce(callback, 0); 
} 
1

如果您發現編程的這種功能性風格難以掌握,那麼將它分成更小的部分。下面的代碼就相當於你:

function bin2dec(num) { 
    var decimal = num.toString().split('').reverse().reduce(addDigit, 0); 
    return decimal; 
} 

function addDigit(preVal, currentVal, iterator) { 
    return (currentVal === '1') ? preVal + Math.pow(2, iterator) : preVal; 
} 

它還可以幫助想「迴歸」爲「得到的值」,而不是「從代碼塊退出」。

+0

感謝您的提示。我試圖按照自己的方式清楚地瞭解它的實施情況。我在第一次嘗試時實際上已經有了你的當前代碼,但是想嘗試將它凝聚成一個函數。當插入返回語句以使我的當前版本正常工作時,我有點猜測。我想我的邏輯關於如何兩個返回語句正常工作是正確的,但我只是想檢查我正確思考。 – HelloWorld

+1

@HelloWorld:你的代碼和你的理解都很好。像你一樣使用匿名函數是可以的;只要你保持內部函數小,它不應該傷害可讀性。 –