网上看到的一道题,分享一下
題目為補(bǔ)全function add, 使add(2)(3)(4) 結(jié)果為9. 原文地址?http://www.cnblogs.com/rubylouvre/archive/2012/02/15/2351991.html?
看到題目第一時間會進(jìn)行加法運(yùn)算 2+3+4 = 9, 所以絕大多數(shù)都會想辦法實(shí)現(xiàn)加法運(yùn)算,同時 我們可以看到進(jìn)行了三次方法調(diào)用,所以必須保證每次調(diào)用的返回值是function類型,
而且,為了保存加法運(yùn)算的結(jié)果,還要利用閉包特性,定義個自由變量來保存,于是下面的代碼產(chǎn)生了
function add(x){var res = 0;return (function(t){res += t;})(x) }run的結(jié)果: undefined is not a function
Oh 此時我們只是把運(yùn)算結(jié)果的值保存起來了,沒有return
于是乎修改:
function add(x){var res = 0;return (function innerAdd(t){res += t;return res;})(x) }run的結(jié)果,number is not a function
很明顯,2(3)(4),會拋錯。因?yàn)槊看蝦eturn的值不是function,于是,可以想到每次可以返回該innerAdd,同時重寫該function的toString()方法,
于是:
function add(x){var res=0;return (function innerAdd(x){res = x+res;arguments.callee.toString = function(){return res;};return arguments.callee;})(x); }其他方式:
特定的方式,利用function的 [[scope]]屬性,這種方式局限性太大,代碼需要根據(jù)調(diào)用次數(shù)的多少來變化
function add(x){return function(y){return function(z){return x+y+z;}} }?
?引用文章作者的方法:
function add(x){if(add.i){add.i += x;}else{add.i=x;}add.toString = function(){return add.i;}return add; }?地址 :?http://jsbin.com/mamajefu/1/edit
轉(zhuǎn)載于:https://www.cnblogs.com/teamobaby/p/3904896.html
總結(jié)
以上是生活随笔為你收集整理的网上看到的一道题,分享一下的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Processing 字体变形
- 下一篇: webrtc 源码结构