摘要:在語言中,函數替換的不是表達式,而是多參數函數,將其替換成一個只接受回調函數作為參數的單參數函數。它的源碼主要多了一個檢查機制,變量確保回調函數只運行一次請看下面的例子。
Thunck函數的含義
編譯器的傳名調用實現,往往是將參數放到一個臨時函數之中,再將這個臨時函數傳入函數體。這個臨時函數就叫做Thunk函數。
function f(m){ return m*2; } f(x+5); //等同于 var thunk = function(){ return x+5; }; function f(thunk){ return thunk()*2; }
上面代碼中,函數f的參數x+5被一個函數替換了。凡是用到原參數的地方,對Thunk函數求值即可。
這就是thunk函數的定義,它是傳名調用的一種實現策略,用來替換某個表達式。
JavaScript語言是傳值調用,它的Thunck函數含義有所不同。在JavaScript語言中,Thunk函數替換的不是表達式,而是多參數函數,將其替換成一個只接受回調函數作為參數的單參數函數。
//正常版本的readFile(多參數版本) fs.readFile(fileName,callback); //Thunk版本的readFile(單參數版本); var Thunk = function(fileName){ return function(callback){ return fs.readFile(fileName,callback); }; }; var readFileThunk = Thunk(fileName); readFileThunk(callback);
上面代碼中,fs模塊的readFile方法是一個錯參數函數,兩個參數分別為文件名和回調函數。經過轉換器處理,它變成了一個但參數函數,只接受回調函數作為參數。這個單參數版本,就叫做Thunk函數。
任何函數,只要參數有回調函數,就能寫成Thunk函數的形式。下面是一個簡單的Thunk函數轉換器。
//ES5版本 var Thunk = function(fn){ return function(){ var args = Array.Prototype.slice.call(arguments); return function(callback){ args.push(callback); return fn.apply(this,args); } }; }; //ES6版本 const Thunk = function(fn){ return function(...args){ return function(callback){ return fn.call(this,...args,callback); } }; }; //使用上面的轉化器,生生fs.readFile的Thunk函數。 var readFileThunk = Thunk(fs.readFile); readFileThunk(fileA)(callback)Thunkify模塊
生產環境的轉換器,建議使用Thunkify模塊。
首先是安裝。
$ npm install thunkify
使用方式如下。
var thunkify = require("thunkify"); var fs = require("fs"); var read = thunkify(fs.readFile); read("package.json")(function(err,str){ //... })
Thunkify的源碼與上面的簡單的轉換器非常像。
function thunkfiy(fn){ return function(){ var args = new Array(arguments.length); var ctx = this; for(var i=0;i它的源碼主要多了一個檢查機制,變量called確保回調函數只運行一次,請看下面的例子。
function f(a,b,callback){ var sum = a+b; callback(sum); callback(sum); } var ft = thunkify(f); var print = console.log.bind(console); ft(1,2)(print); //上面代碼中,由于thunkify只允許回調函數執行一次,所以只輸出一行結果。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/99611.html
摘要:前言入門阮一峰另類的實現同級別的另外一個函數。該事件系統允許代碼定義應用程序的特定事件,該事件可以傳遞自定義參數,自定義參數包含訂閱者所需要的值。其目的是避免訂閱者和發布者產生依賴關系。狀態轉變不可逆。方法必須返回一個。 callback 前言 ECMAScript 6入門(阮一峰) showImg(https://segmentfault.com/img/remote/1460000...
摘要:的異步完成整個異步環節的有事件循環觀察者請求對象以及線程池。執行回調組裝好請求對象送入線程池等待執行,實際上是完成了異步的第一部分,回調通知是第二部分。異步編程是首個將異步大規模帶到應用層面的平臺。 showImg(https://segmentfault.com/img/remote/1460000011303472); 本文首發在個人博客:http://muyunyun.cn/po...
摘要:在語言中,函數替換的不是表達式,而是多參數函數,將其替換成一個只接受回調函數作為參數的單參數函數。為什么里面必須使用函數呢,因為我們需要確保傳入的值只有一個,利用其回調函數,來進行遞歸自動控制函數的流程,接收和交還程序的執行權 前言 這篇文章主要是梳理一下自己對阮一峰大神寫的關于async/await文章,有寫得不對的地方以及理解得不對的地方,各位大佬請指錯! 對比 簡單對比傳統異步,...
摘要:總結執行方法本質上相當于注冊一個回調函數,而函數結合函數就是一種更直觀的注冊回調函數的方式。函數負責異步執行交出執行權,而函數負責注冊回調返回執行權,執行下一步,兩者結合從而自動執行函數。 今天又看了一遍阮一峰老師的《Thunk 函數的含義和用法》,這里整理一下自己的理解: 在 JavaScript 語言中,Thunk 函數替換的不是表達式,而是多參數函數,將其替換成單參數的版本,且只...
閱讀 1382·2021-09-22 10:02
閱讀 1862·2021-09-08 09:35
閱讀 4044·2021-08-12 13:29
閱讀 2594·2019-08-30 15:55
閱讀 2257·2019-08-30 15:53
閱讀 2295·2019-08-29 17:13
閱讀 2753·2019-08-29 16:31
閱讀 2948·2019-08-29 12:24