當前位置:
首頁 >
前端技术
> javascript
>内容正文
javascript
两道关于JS的小考题(闭包与中间件)
生活随笔
收集整理的這篇文章主要介紹了
两道关于JS的小考题(闭包与中间件)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目一:寫一個javascript函數 calculate,該函數有如下性質
calculate() = 0; calculate(2)() = 2; calculate(3)(4)(1)(5)() = 13;即可以連續地鏈式調用,一旦碰到一次調用沒有參數的,則返回前面所有參數的和。
其實題目本身并不算復雜,代碼也非常簡單,就是思路有點繞,可能要在電腦上反復試試調調才能寫對,答案如下:
var calculate = (function () {var sum = 0;var func = function () {if (arguments.length === 0) {var ret = sum;sum = 0;return ret;}sum += arguments[0];return func;};return func; })();console.log(calculate()); // 輸出0 console.log(calculate(100)()); // 輸出100 console.log(calculate(1)(2)(3)(4)()); // 輸出10主要思路就是用閉包變量記錄當前的結果,所寫的函數一旦沒有參數,就返回數字結果,一旦有一個參數,記錄下當前的和,然后返回函數自己。
?
題目二:有一個JS函數,函數名為APP,它滿足如下性質:
var func1 = function (next) {console.log('func1 begin');next();console.log('func1 end'); };var func2 = function (next) {console.log('func2 begin');next();console.log('func2 end'); };var func3 = function (next) {console.log('func3 begin');next();console.log('func3 end'); };var a = new APP(); a.use(func1); a.use(func2); a.use(func3); a.run();// output: // func1 begin // func2 begin // func3 begin // func3 end // func2 end // func1 end有點類似于中間件一樣,APP實例化以后,可以用use方法注冊一系列函數,并通過run方法依次把注冊的函數跑一遍,注冊的函數都接受一個next函數作為參數,一旦碰到next執行,則遞歸調用下一個注冊函數。請寫出APP這個函數的實現。
剛看到這個題目的時候有點蒙圈,感覺無從下筆,思考了很久以后發現……原來這么簡單……自己把自己繞進去了。答案如下:
var APP = function() {this.stack = []; }; APP.prototype.use = function (cb) {this.stack.push(cb); }; APP.prototype.run = function() {var self = this;var next = function () {if(self.stack.length < 1) {return;}var cb = self.stack.shift();cb(next);};next(); };?
轉載于:https://www.cnblogs.com/xuning/p/6127677.html
總結
以上是生活随笔為你收集整理的两道关于JS的小考题(闭包与中间件)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 树莓派编译C++
- 下一篇: CDN服务技术架构图