日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

两道关于JS的小考题(闭包与中间件)

發布時間:2025/3/21 javascript 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 两道关于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的小考题(闭包与中间件)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。