摘要:在語言中,函數(shù)替換的不是表達(dá)式,而是多參數(shù)函數(shù),將其替換成一個只接受回調(diào)函數(shù)作為參數(shù)的單參數(shù)函數(shù)。它的源碼主要多了一個檢查機(jī)制,變量確?;卣{(diào)函數(shù)只運(yùn)行一次請看下面的例子。
Thunck函數(shù)的含義
編譯器的傳名調(diào)用實(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ù)的定義,它是傳名調(diào)用的一種實(shí)現(xiàn)策略,用來替換某個表達(dá)式。
JavaScript語言是傳值調(diào)用,它的Thunck函數(shù)含義有所不同。在JavaScript語言中,Thunk函數(shù)替換的不是表達(dá)式,而是多參數(shù)函數(shù),將其替換成一個只接受回調(diào)函數(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ù)分別為文件名和回調(diào)函數(shù)。經(jīng)過轉(zhuǎn)換器處理,它變成了一個但參數(shù)函數(shù),只接受回調(diào)函數(shù)作為參數(shù)。這個單參數(shù)版本,就叫做Thunk函數(shù)。
任何函數(shù),只要參數(shù)有回調(diào)函數(shù),就能寫成Thunk函數(shù)的形式。下面是一個簡單的Thunk函數(shù)轉(zhuǎn)換器。
//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); } }; }; //使用上面的轉(zhuǎn)化器,生生fs.readFile的Thunk函數(shù)。 var readFileThunk = Thunk(fs.readFile); readFileThunk(fileA)(callback)Thunkify模塊
生產(chǎn)環(huán)境的轉(zhuǎ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的源碼與上面的簡單的轉(zhuǎn)換器非常像。
function thunkfiy(fn){ return function(){ var args = new Array(arguments.length); var ctx = this; for(var i=0;i它的源碼主要多了一個檢查機(jī)制,變量called確?;卣{(diào)函數(shù)只運(yùn)行一次,請看下面的例子。
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只允許回調(diào)函數(shù)執(zhí)行一次,所以只輸出一行結(jié)果。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/99611.html
摘要:前言入門阮一峰另類的實(shí)現(xiàn)同級別的另外一個函數(shù)。該事件系統(tǒng)允許代碼定義應(yīng)用程序的特定事件,該事件可以傳遞自定義參數(shù),自定義參數(shù)包含訂閱者所需要的值。其目的是避免訂閱者和發(fā)布者產(chǎn)生依賴關(guān)系。狀態(tài)轉(zhuǎn)變不可逆。方法必須返回一個。 callback 前言 ECMAScript 6入門(阮一峰) showImg(https://segmentfault.com/img/remote/1460000...
摘要:捕抓信息,并且出錯時,傳遞給回調(diào)函數(shù)回調(diào)函數(shù)應(yīng)該只調(diào)用一次??偨Y(jié)在學(xué)習(xí)一個概念或者一個模塊時,測試代碼加深你對知識的理解和掌握。 一步步打造thunkify 本文的思路: 學(xué)習(xí)thunk相關(guān)知識,主要參考阮一峰的介紹 一步步實(shí)現(xiàn)thunkify模塊,并且使用測試用例來完善我們的代碼,打造出一個健壯的模塊 1. 誕生背景 Thunk函數(shù)的誕生是源于一個編譯器設(shè)計(jì)的問題:求值策略,即函...
摘要:的異步完成整個異步環(huán)節(jié)的有事件循環(huán)觀察者請求對象以及線程池。執(zhí)行回調(diào)組裝好請求對象送入線程池等待執(zhí)行,實(shí)際上是完成了異步的第一部分,回調(diào)通知是第二部分。異步編程是首個將異步大規(guī)模帶到應(yīng)用層面的平臺。 showImg(https://segmentfault.com/img/remote/1460000011303472); 本文首發(fā)在個人博客:http://muyunyun.cn/po...
摘要:在語言中,函數(shù)替換的不是表達(dá)式,而是多參數(shù)函數(shù),將其替換成一個只接受回調(diào)函數(shù)作為參數(shù)的單參數(shù)函數(shù)。為什么里面必須使用函數(shù)呢,因?yàn)槲覀冃枰_保傳入的值只有一個,利用其回調(diào)函數(shù),來進(jìn)行遞歸自動控制函數(shù)的流程,接收和交還程序的執(zhí)行權(quán) 前言 這篇文章主要是梳理一下自己對阮一峰大神寫的關(guān)于async/await文章,有寫得不對的地方以及理解得不對的地方,各位大佬請指錯! 對比 簡單對比傳統(tǒng)異步,...
摘要:總結(jié)執(zhí)行方法本質(zhì)上相當(dāng)于注冊一個回調(diào)函數(shù),而函數(shù)結(jié)合函數(shù)就是一種更直觀的注冊回調(diào)函數(shù)的方式。函數(shù)負(fù)責(zé)異步執(zhí)行交出執(zhí)行權(quán),而函數(shù)負(fù)責(zé)注冊回調(diào)返回執(zhí)行權(quán),執(zhí)行下一步,兩者結(jié)合從而自動執(zhí)行函數(shù)。 今天又看了一遍阮一峰老師的《Thunk 函數(shù)的含義和用法》,這里整理一下自己的理解: 在 JavaScript 語言中,Thunk 函數(shù)替換的不是表達(dá)式,而是多參數(shù)函數(shù),將其替換成單參數(shù)的版本,且只...
閱讀 1391·2021-09-22 10:02
閱讀 1914·2021-09-08 09:35
閱讀 4065·2021-08-12 13:29
閱讀 2611·2019-08-30 15:55
閱讀 2266·2019-08-30 15:53
閱讀 2305·2019-08-29 17:13
閱讀 2766·2019-08-29 16:31
閱讀 2957·2019-08-29 12:24