各位先進好,
關於javascript原生function replace中把function當作參數的作法的問題,
下方程式碼中replace(/{([^{}]*)}/g,function(a,b){...})
我下中斷點去看,
發現參數a,b分別代表replace前、後的資料,請問實際上他是怎麼去做對應的呢?
if (!String.prototype.supplant) {
String.prototype.supplant = function (o) {
return this.replace(/{([^{}]*)}/g,
function (a, b) {//a:原型,b:replace後的值
var r = o[b];
return typeof r === 'string' || typeof r === 'number' ? r : a;
}
);
};
}
怎麼對應的? replace函數的兩個參數:
a = searchvalue
b = newvalue
str.replace(searchvalue, newvalue)
可能是我問的沒有很清楚
我指的是說如果newvalue是使用function的情況之下,
其中function(a,b,c..)他的參數傳遞的機制。
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace
MDN有解釋說在function作為參數的情況下它本身的參數所代表的意思,但我這邊想搞懂的地方是他replace這個function是如何實現的,我在想他是不是在replace宣告上有使用到call 或 apply
這是custom function的作法,表示可以讓使用者自訂取代的方式,實現方式就是提供傳入function, 並將replace(a, b)的參數,傳給自訂的function test(a,b)
底層實現並不是Javascript吧XD
理解底層實現是要? 自己寫一套javascript? 有什麼意義嗎?
可以當作學習, 也可以更理解這個語言, 有時候還可以偷學到一點官方密技
先看懂ECMA-262規格書吧XD,Javascript實做都是遵循規格書的...內建物件在很後面,沒記錯的話應該是最後一章
另外,大部分Javascript引擎例如V8、SpiderMonkey等都是OpenSource,可以研究一下他的原始碼。(V8用C++,SpiderMonkey是C)
典型的走火入魔,適合太閒的人,如果是js語法也就罷了,
已經不是js的範圍,與其花時間去了解,還不如把js學得熟練一點
請勿理會這段留言,剛剛因為連線異常,留言重複...
而且好像沒辦法刪除自己的留言阿QQ
您的問題都蠻有趣的,我也常對一些 特別
的地方感到好奇。
看了 weiclin 大提供的原始碼,重點部分真的不是 JS,%StringReplaceGlobalRegExpWithString
應該就是原生函數了。
var answer = %StringReplaceGlobalRegExpWithString(
subject, search, replace, $regexpLastMatchInfo);
找到 C++ 原始碼
https://github.com/v8/v8/blob/master/src/runtime/runtime-regexp.cc
不過太複雜了,小弟就不研究了,我知道它是個 callback 就好了,哈哈哈。