javascript
javascript 函数 add(1)(2)(3)(4)实现无限极累加 —— 一步一步原理解析
問(wèn)題:我們有一個(gè)需求,用js 實(shí)現(xiàn)一個(gè)無(wú)限極累加的函數(shù), 形如 add(1) //=> 1; add(1)(2) ?//=> 2; add(1)(2)(3) //=> ?6; add(1)(2)(3)(4) //=> 10; 以此類推。。。。。
乍一看很神奇, 下面我將一步一步實(shí)現(xiàn)一個(gè)這樣的 add()函數(shù)。
第一步:首先, ?我們要了解一個(gè)知識(shí)點(diǎn): 函數(shù)的 toString()方法當(dāng)我們直接alert() 一個(gè)函數(shù)的時(shí)候會(huì)被調(diào)用(或者 用 console.log() 打印一個(gè)函數(shù)的時(shí)候會(huì)被調(diào)用)。
舉一個(gè)例子:
function s(a){return a+1; } alert(s);
第二步:好的,我們現(xiàn)在對(duì)函數(shù) s 定義一個(gè) toSting() 方法
function s(a){return a+1; } s.toString = function(){return 2;} console.log(s); typeof(s)
定義了s.toString 方法后, 直接console.log(s) 的話,會(huì)打印出這個(gè)函數(shù), 如果直接 alert(s)的話,我們可以看到會(huì)彈出 “2”, 我們檢測(cè)一下s 的類型(typeof(s)),
顯然 s 是一個(gè)函數(shù)。
第三步:好的,現(xiàn)在我們來(lái)給這個(gè) ?s ?函數(shù)包裹上一層"外套" ?-:)
在上面的代碼中,我們給之前的代碼 包裹了一層,并且也修改了一下s.toSting() 方法,讓它返回的是外面?zhèn)鬟f進(jìn)來(lái)的參數(shù)a, 而不是之前固定的2。
包裹了一層后,返回值為一個(gè)函數(shù),這樣就形成了一個(gè)閉包。?這樣,我們?cè)谡{(diào)用 add(3) 的時(shí)候,返回值其實(shí)是一個(gè)函數(shù), 里面的 s 這個(gè)函數(shù)。
但是,當(dāng)我們 alert(s(3)) 的時(shí)候, 會(huì)彈出 ?3 。
第四步:好的,下面是最后一步,“見(jiàn)證奇跡的時(shí)刻到了”————
到這里,我們可以看到,上面 console.log(add(1)(2)(3)(4)); 這句話打印出 一個(gè)函數(shù), ?function 10 ?, 其實(shí)就是當(dāng) alert(add(1)(2)(3)(4));的時(shí)候,會(huì)彈出 10.
這就是 add(1)(2)(3)(4); 的實(shí)現(xiàn)過(guò)程,顯然,我們這個(gè)累加函數(shù)是可以無(wú)限調(diào)用的 。-:) 小開(kāi)心一下哈
?
下面,我來(lái)談一談個(gè)人的思路和理解,還望大家能踴躍參數(shù), 幫忙指點(diǎn)我一下,不甚感激!
我覺(jué)得:整個(gè)實(shí)現(xiàn)過(guò)程就是兩個(gè)關(guān)鍵點(diǎn)。
1. 使用閉包, 同時(shí)要對(duì)JavaScript 的作用域鏈(原型鏈)有深入的理解;
2. 重寫(xiě)函數(shù)的 toSting()方法;
好的,對(duì)add(1)(2)(3); 一步一步分析:?
a) 執(zhí)行add(1); ??
返回的是里面的 ?s ?函數(shù), 通過(guò)閉包,s 函數(shù)里面可以訪問(wèn)到 變量 a=1; ?所以 當(dāng)我們 alert(add(1)); 的時(shí)候, 調(diào)用的 toSting()方法會(huì)將作用域(原型鏈)里面的 a = 1 彈出來(lái)。
b) 執(zhí)行add(1)(2);
<===等價(jià)于===> s(2); ?這里面相當(dāng)于 把 2 傳遞給 s()函數(shù)里面的 b , 讓作用域(原型鏈)里面的 a = a+b ,此時(shí) a = 3, 繼續(xù)保存在作用域中了。 然后還是返回 s 函數(shù)。
c) 執(zhí)行 add(1)(2)(3);?
<===等價(jià)于===> s(3);和上面 b) 中的分析一樣,只是更新了作用域中的 a = 6 了,然后同樣是返回 s 函數(shù)。
總結(jié)
以上是生活随笔為你收集整理的javascript 函数 add(1)(2)(3)(4)实现无限极累加 —— 一步一步原理解析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 1050 循环数组最大子段和
- 下一篇: JS 处理Json 时间带T 时间格