2015-01-14 173 views
-2

對於這種編程我真的很陌生,我有一段代碼,我有一些疑問。JavaScript函數說明

代碼:

function numFormat(n) { 
    return n.toFixed(0).replace(/./g, function(c, i, a) { 
     //console.log(a); 
     return i > 0 && c !== "." && (a.length - i) % 3 === 0 ? "," + c : c; 
    }); 
} 

其實我知道它做什麼,它變成了許多例如在3組1234 1,234分歧與「」貨幣的數字。

我真的不明白它是如何做到的。 我不知道從哪裏我和一個充滿了什麼和從哪裏!?

請問有人可以向我解釋這個功能嗎?

感謝和問候

+1

[String.prototype.replace()的(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace) – melancia

+0

可能重複[怎麼辦JavaScript的封閉工作?](http://stackoverflow.com/questions/111102/how-do-javascript-closures-work) – Ryan

+0

我已閱讀,但我仍然無法找到我仍然找不到,仍然我不得到ci和a從哪裏得到! – Combinu

回答

1

替換

的替代函數接受一個正則表達式,並替換爲一個值的每個匹配。替換值由您作爲第二個參數傳遞給replace的函數決定。

匿名函數作爲回調

匿名功能沒有(可見的)從JavaScript代碼調用,而是由replace函數內部調用。您不會將函數結果傳遞給replace,因此replace可以調用您的函數來處理匹配。這樣你就可以將行爲注入到JavaScript的內置函數中。這是JavaScript中的一個常見概念,您會在很多場合遇到這種情況。

'。'模式中的通配符

因此,該模式的每個匹配都會調用該函數。這種模式的核心是點號.字符。這是一個通配符,意思是「任何角色」。因此給定數字中的任何字符都與該點匹配。這樣做的效果是,該數字中的每個單獨的字符都會調用該函數。

參數和回調

的內部運作然後參數aci。回調函數參數的含義當然是爲替換函數記錄的,但是如果您將c,i和a輸出到控制檯,可能會立即變得有點清晰,正如我在下面的代碼片段中所做的那樣。

function numFormat(n) { 
 
return n.toFixed(0).replace(/./g, function(c, i, a) { 
 
    console.log(a + ',' + i +',' + c); 
 
    return i > 0 && c !== "." && (a.length - i) % 3 === 0 ? "," + c : c; 
 
}); 
 
} 
 

 
alert(numFormat(107784));

該函數的參數是匹配的子(c),這是的各時間(如由圖案匹配的)一個字符,偏移/串位置(i)匹配和整個字符串(a)。

使用偏移量i,進行計算以確定它是否是第三個字符。如果是這樣,字符c在它前面以逗號返回,否則,只返回字符。 i > 0被添加爲一個額外的條件,以防止在字符串的開始逗號。 c !== "."似乎已經過時,並且可能是支持浮點數字的嘗試中的剩餘部分。

所有這些返回的字符串都放在一起(再次,內部由replace),並將形成替換函數的返回值。

附加文檔

+0

好吧,我已經看到了控制檯,但仍然不能得到什麼變量正在傳遞給C,我和一個從哪裏?我的意思是你正在傳遞(107784)到n的函數numFormat,但是通過c i和一個 – Combinu

+0

@MysticJay爲什麼你不粘一些'console.log()'並檢查它們? – melancia

+1

@MysticJay MDN頁面上的['replace'](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace#Specifying_a_function_as_a_parameter)部分詳細介紹了函數參數。在將'function'作爲第二個參數傳遞給'replace'時,第一個參數(即'c')是匹配子串(即上述情況下的'107784'),第二個參數(即'i')是匹配子字符串中的第n個位置(即,第一次迭代爲'0',第二次迭代爲'1'等),而最後一個(即「a」)是該迭代中的當前值。 –

1

快速概述:
對於每一個字符在給定的輸入

return n.toFixed(0).replace(/./g, function(c, i, a) { 

執行以下三元:

return i > 0 && c !== "." && (a.length - i) % 3 === 0 ? "," + c : c; 

這可以簡單地寫爲

if (i > 0 && c !== "." && (a.length - i) % 3 === 0) { 
    return "," + c; 
} else { 
    return c; 
}; 

的參數cia如在the spec概述的,即:

  • c是匹配的子串,即,輸入
  • i的單個字符匹配的子串的偏移,在本文中意思是我們目前使用的字符的索引
  • a是正在檢查的總字符串

結合這一切,我們可以改寫

if (i > 0 && c !== "." && (a.length - i) % 3 === 0) { 
    return "," + c; 
} else { 
    return c; 
}; 

如果我們不看輸入的第一個字符

如果字符我們看着不是一個點

如果的檢查炭目前指數是由三個整除(因爲我們希望每三個字符分隔)
然後插入一個逗號緊跟當前字符,
否則替換與自己的性格。

+1

注意更新您的答案,以包含'replace'函數的函數部分以及該函數接受哪些參數?這似乎是OP有一些混淆的地方。 –

+0

好吧,我得到那部分,但什麼變量正在傳遞給C,我和一個? – Combinu

+0

我已經更新了答案。 – Nit