摘要:在語言中,函數(shù)替換的不是表達式,而是多參數(shù)函數(shù),將其替換成一個只接受回調函數(shù)作為參數(shù)的單參數(shù)函數(shù)。它的源碼主要多了一個檢查機制,變量確保回調函數(shù)只運行一次請看下面的例子。
Thunck函數(shù)的含義
編譯器的傳名調用實現(xiàn),往往是將參數(shù)放到一個臨時函數(shù)之中,再將這個臨時函數(shù)傳入函數(shù)體。這個臨時函數(shù)就叫做Thunk函數(shù)。
function f(m){ return m*2; } f(x+5); //等同于 var thunk = function(){ return x+5; }; function f(thunk){ return thunk()*2; }
上面代碼中,函數(shù)f的參數(shù)x+5被一個函數(shù)替換了。凡是用到原參數(shù)的地方,對Thunk函數(shù)求值即可。
這就是thunk函數(shù)的定義,它是傳名調用的一種實現(xiàn)策略,用來替換某個表達式。
JavaScript語言是傳值調用,它的Thunck函數(shù)含義有所不同。在JavaScript語言中,Thunk函數(shù)替換的不是表達式,而是多參數(shù)函數(shù),將其替換成一個只接受回調函數(shù)作為參數(shù)的單參數(shù)函數(shù)。
//正常版本的readFile(多參數(shù)版本) fs.readFile(fileName,callback); //Thunk版本的readFile(單參數(shù)版本); var Thunk = function(fileName){ return function(callback){ return fs.readFile(fileName,callback); }; }; var readFileThunk = Thunk(fileName); readFileThunk(callback);
上面代碼中,fs模塊的readFile方法是一個錯參數(shù)函數(shù),兩個參數(shù)分別為文件名和回調函數(shù)。經過轉換器處理,它變成了一個但參數(shù)函數(shù),只接受回調函數(shù)作為參數(shù)。這個單參數(shù)版本,就叫做Thunk函數(shù)。
任何函數(shù),只要參數(shù)有回調函數(shù),就能寫成Thunk函數(shù)的形式。下面是一個簡單的Thunk函數(shù)轉換器。
//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函數(shù)。 var readFileThunk = Thunk(fs.readFile); readFileThunk(fileA)(callback)Thunkify模塊
生產環(huán)境的轉換器,建議使用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確保回調函數(shù)只運行一次,請看下面的例子。
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只允許回調函數(shù)執(zhí)行一次,所以只輸出一行結果。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/99611.html
摘要:前言入門阮一峰另類的實現(xiàn)同級別的另外一個函數(shù)。該事件系統(tǒng)允許代碼定義應用程序的特定事件,該事件可以傳遞自定義參數(shù),自定義參數(shù)包含訂閱者所需要的值。其目的是避免訂閱者和發(fā)布者產生依賴關系。狀態(tài)轉變不可逆。方法必須返回一個。 callback 前言 ECMAScript 6入門(阮一峰) showImg(https://segmentfault.com/img/remote/1460000...
摘要:的異步完成整個異步環(huán)節(jié)的有事件循環(huán)觀察者請求對象以及線程池。執(zhí)行回調組裝好請求對象送入線程池等待執(zhí)行,實際上是完成了異步的第一部分,回調通知是第二部分。異步編程是首個將異步大規(guī)模帶到應用層面的平臺。 showImg(https://segmentfault.com/img/remote/1460000011303472); 本文首發(fā)在個人博客:http://muyunyun.cn/po...
摘要:在語言中,函數(shù)替換的不是表達式,而是多參數(shù)函數(shù),將其替換成一個只接受回調函數(shù)作為參數(shù)的單參數(shù)函數(shù)。為什么里面必須使用函數(shù)呢,因為我們需要確保傳入的值只有一個,利用其回調函數(shù),來進行遞歸自動控制函數(shù)的流程,接收和交還程序的執(zhí)行權 前言 這篇文章主要是梳理一下自己對阮一峰大神寫的關于async/await文章,有寫得不對的地方以及理解得不對的地方,各位大佬請指錯! 對比 簡單對比傳統(tǒng)異步,...
摘要:總結執(zhí)行方法本質上相當于注冊一個回調函數(shù),而函數(shù)結合函數(shù)就是一種更直觀的注冊回調函數(shù)的方式。函數(shù)負責異步執(zhí)行交出執(zhí)行權,而函數(shù)負責注冊回調返回執(zhí)行權,執(zhí)行下一步,兩者結合從而自動執(zhí)行函數(shù)。 今天又看了一遍阮一峰老師的《Thunk 函數(shù)的含義和用法》,這里整理一下自己的理解: 在 JavaScript 語言中,Thunk 函數(shù)替換的不是表達式,而是多參數(shù)函數(shù),將其替換成單參數(shù)的版本,且只...
閱讀 1389·2021-09-22 10:02
閱讀 1901·2021-09-08 09:35
閱讀 4061·2021-08-12 13:29
閱讀 2608·2019-08-30 15:55
閱讀 2265·2019-08-30 15:53
閱讀 2301·2019-08-29 17:13
閱讀 2762·2019-08-29 16:31
閱讀 2955·2019-08-29 12:24