电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

JS Thunk 函數(shù)的含義和用法實例總結

瀏覽:100日期:2024-05-13 15:45:29

本文實例講述了JS Thunk 函數(shù)的含義和用法。分享給大家供大家參考,具體如下:

前面我們已經(jīng)學習過了Generator 函數(shù)的優(yōu)勢和使用場景。

這篇文章我們繼續(xù)學習阮老師的第二篇文章,Thunk 函數(shù)的含義和用法

說實話,在這之前是沒聽過這個詞的,但其實如果你對犀牛書里的不完全函數(shù)有認真看過的話理解起來也不是很費勁。

首先什么是 thunk 函數(shù)?

很多場景下我們都會陷入一個問題,就是函數(shù)參數(shù)的求值時間。

是函數(shù)調(diào)用時即求值還是在函數(shù)內(nèi)使用時才求值?

var x = 1;function f(m){ return m * 2; }f(x + 5)//我們把在調(diào)用時就計算的方式稱為傳值調(diào)用,等同于:f(6)//我們把在函數(shù)內(nèi)部使用時才求值的方式稱為傳名調(diào)用,等同于:return (x + 5) * 2;

兩種方式各有利弊,傳值調(diào)用比較簡單,但是如果計算后的結果沒有在程序中使用的話,損失就有點大。因此有很多場景都傾向于傳名調(diào)用。

但是像 C,java 的編譯方式都是固定的,如何基于現(xiàn)有基礎改變程序的執(zhí)行方式。

比較常見的是將想要傳名調(diào)用的參數(shù)放到一個臨時函數(shù)之中,把臨時函數(shù)當做參數(shù),只在使用的時候執(zhí)行。

這個包裝參數(shù)的臨時函數(shù)就叫 Thunk 函數(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ù),跟 Thunk 函數(shù)一個道理,

通過 return 一個 function 來實現(xiàn)傳名調(diào)用。

老師也順便介紹了用在生產(chǎn)環(huán)境的 Thunkify 模塊

我們看一下源碼,還是有一些好玩的地方的。

function thunkify(fn){ //全局返回一個臨時函數(shù) return function(){ var args = new Array(arguments.length); var ctx = this; for(var i = 0; i < args.length; ++i) { args[i] = arguments[i]; } //上面一段將參數(shù)copy到args return function(done){ var called; args.push(function(){ if (called) return; //對callback重新包裝,控制callback只執(zhí)行一次 called = true; done.apply(null, arguments); }); try { fn.apply(ctx, args); } catch (err) { done(err); } } }};

執(zhí)行結果:

function f(a, b, callback){ var sum = a + b; callback(sum); callback(sum);} var ft = thunkify(f);ft(1, 2)(console.log); // 3

這個地方的理解,方法f在執(zhí)行時的參數(shù)并不是 1,2,console.log

console.log 參數(shù)在 thunkify 內(nèi)部被重新包裝,成了:

function(){ if (called) return; //對callback重新包裝,控制callback只執(zhí)行一次 called = true; console.log.apply(null, arguments);}

了解了 Thunk 函數(shù)之后,我們要停下來想一想,還是那句話,它的出現(xiàn)要解決什么問題?

是不是一定要使用 Thunk 函數(shù)?Thunk 用在什么場景下?

從前面的內(nèi)容來看,其實并沒有什么用,可能概念比較新穎,但是使用起來好像并沒有太多提高。

但是沒用的話我們也不會寫這么一篇文章。

自從有了 Generator 函數(shù),Thunk 函數(shù)現(xiàn)在可以用于 Generator 函數(shù)的自動流程管理。

看一下例子:

var fs = require(’fs’);var thunkify = require(’thunkify’);var readFile = thunkify(fs.readFile); var gen = function* (){ var r1 = yield readFile(’/etc/fstab’); console.log(r1.toString()); var r2 = yield readFile(’/etc/shells’); console.log(r2.toString());};

這個例子中,我們使用 yield 將執(zhí)行權交給下一個協(xié)程,那么就需要有一種方法把執(zhí)行權在交還給當前函數(shù)

這種方法就是 Thunk 函數(shù),因為它可以重新包裝回調(diào)函數(shù),我們可以自己寫包裝函數(shù),將執(zhí)行權交還給 Generator 函數(shù)。

為了對比,我們先看一下如果手動執(zhí)行上面的代碼會是什么樣的:

var g = gen(); //開始執(zhí)行協(xié)程var r1 = g.next(); //讀取第一個文件r1.value(function(err, data){ //讀取完成執(zhí)行回調(diào) if (err) throw err; var r2 = g.next(data); //讀取第二個文件 r2.value(function(err, data){ //讀取完成執(zhí)行回調(diào) if (err) throw err; g.next(data);//結束協(xié)程 });});

不難發(fā)現(xiàn),上面的代碼其實就是將同一個回調(diào)函數(shù)傳入 value 屬性(next 執(zhí)行返回 value 和 done )

我在看的時候就在想,這個value是屬性啊,為什么可以執(zhí)行?還傳遞參數(shù)?

慢慢理一理:

value屬性是yield的返回值,gen中的yield返回的是一個 Thunk 函數(shù),不是固定值。

所以可以執(zhí)行value,看前面例子里的這句:ft(1, 2)(console.log);

value就等同于ft(1, 2)的返回值

傳遞的function回調(diào)等同于(console.log);

這么是不是就理解了?

Thunk 函數(shù)真正的威力,在于可以自動執(zhí)行 Generator 函數(shù)。下面就是一個基于 Thunk 函數(shù)的 Generator 執(zhí)行器:

function run(fn) { var gen = fn(); //自動開始協(xié)程 //對next進行包裝,形成 Thunk 函數(shù),遍歷調(diào)用 function next(err, data) { var result = gen.next(data); if (result.done) return; result.value(next); } next(); /* 參考bootstrap的寫法改寫一下 !function next(err, data) { var result = gen.next(data); if (result.done) return; result.value(next); }(); */}run(gen);

上面的寫法很簡單吧,這么改寫之后就不需要你手動的去控制執(zhí)行next的時機了

只需要執(zhí)行run函數(shù)就行。但是要保證每一個yield后面都是一個 Thunk 函數(shù),否則的話就不能自動執(zhí)行了。

這一章的學習總結就結束了,我們學會了如何使用 Thunk 函數(shù)實現(xiàn)自動執(zhí)行,但 Thunk 函數(shù)并不是 Generator 函數(shù)自動執(zhí)行的唯一方案。

因為自動執(zhí)行的關鍵是,必須有一種機制,自動控制 Generator 函數(shù)的流程,接收和交還程序的執(zhí)行權。回調(diào)函數(shù)可以做到這一點,Promise 對象也可以做到這一點。

下一篇文章我們?nèi)タ匆幌禄趐romise實現(xiàn)的自動執(zhí)行器:co

原文:Thunk 函數(shù)的含義和用法

感興趣的朋友可以使用在線HTML/CSS/JavaScript代碼運行工具:http://tools.jb51.net/code/HtmlJsRun測試上述代碼運行效果。

更多關于JavaScript相關內(nèi)容可查看本站專題:《JavaScript常用函數(shù)技巧匯總》、《javascript面向?qū)ο笕腴T教程》、《JavaScript錯誤與調(diào)試技巧總結》、《JavaScript數(shù)據(jù)結構與算法技巧總結》及《JavaScript數(shù)學運算用法總結》

希望本文所述對大家JavaScript程序設計有所幫助。

標簽: JavaScript
相關文章:
主站蜘蛛池模板: 高精度-恒温冷水机-螺杆式冰水机-蒸发冷冷水机-北京蓝海神骏科技有限公司 | 游泳池设计|设备|配件|药品|吸污机-东莞市太平洋康体设施有限公司 | 电线电缆厂家|沈阳电缆厂|电线厂|沈阳英联塑力线缆有限公司 | 户外-组合-幼儿园-不锈钢-儿童-滑滑梯-床-玩具-淘气堡-厂家-价格 | 匀胶机旋涂仪-声扫显微镜-工业水浸超声-安赛斯(北京)科技有限公司 | 二手光谱仪维修-德国OBLF光谱仪|进口斯派克光谱仪-热电ARL光谱仪-意大利GNR光谱仪-永晖检测 | 北京发电车出租-发电机租赁公司-柴油发电机厂家 - 北京明旺盛安机电设备有限公司 | 磁力加热搅拌器-多工位|大功率|数显恒温磁力搅拌器-司乐仪器官网 | 广州/东莞小字符喷码机-热转印打码机-喷码机厂家-广州瑞润科技 | 扫地车厂家-山西洗地机-太原电动扫地车「大同朔州吕梁晋中忻州长治晋城洗地机」山西锦力环保科技有限公司 | 不锈钢闸阀_球阀_蝶阀_止回阀_调节阀_截止阀-可拉伐阀门(上海)有限公司 | 多米诺-多米诺世界纪录团队-多米诺世界-多米诺团队培训-多米诺公关活动-多米诺创意广告-多米诺大型表演-多米诺专业赛事 | 台湾Apex减速机_APEX行星减速机_台湾精锐减速机厂家代理【现货】-杭州摩森机电 | U拓留学雅思一站式服务中心_留学申请_雅思托福培训 | ALC墙板_ALC轻质隔墙板_隔音防火墙板_轻质隔墙材料-湖北博悦佳 | 防水套管_柔性防水套管_刚性防水套管-巩义市润达管道设备制造有限公司 | 通风气楼_通风天窗_屋顶风机-山东美创通风设备有限公司 | 铝合金线槽_铝型材加工_空调挡水板厂家-江阴炜福金属制品有限公司 | 安徽合肥项目申报咨询公司_安徽合肥高新企业项目申报_安徽省科技项目申报代理 | 陕西安玻璃自动感应门-自动重叠门-磁悬浮平开门厂家【捷申达门业】 | 焊管生产线_焊管机组_轧辊模具_焊管设备_焊管设备厂家_石家庄翔昱机械 | pos机办理,智能/扫码/二维码/微信支付宝pos机-北京万汇通宝商贸有限公司 | H型钢切割机,相贯线切割机,数控钻床,数控平面钻,钢结构设备,槽钢切割机,角钢切割机,翻转机,拼焊矫一体机 | 深圳高新投三江工业消防解决方案提供厂家_服务商_园区智慧消防_储能消防解决方案服务商_高新投三江 | 中开泵,中开泵厂家,双吸中开泵-山东博二泵业有限公司 | 电气控制系统集成商-PLC控制柜变频控制柜-非标自动化定制-电气控制柜成套-NIDEC CT变频器-威肯自动化控制 | 东莞市海宝机械有限公司-不锈钢分选机-硅胶橡胶-生活垃圾-涡电流-静电-金属-矿石分选机 | 北京三友信电子科技有限公司-ETC高速自动栏杆机|ETC机柜|激光车辆轮廓测量仪|嵌入式车道控制器 | 注塑模具_塑料模具_塑胶模具_范仕达【官网】_东莞模具设计与制造加工厂家 | 纳米涂料品牌 防雾抗污纳米陶瓷涂料厂家_虹瓷科技 | 青州搬家公司电话_青州搬家公司哪家好「鸿喜」青州搬家 | 微信聊天记录恢复_手机短信删除怎么恢复_通讯录恢复软件下载-快易数据恢复 | 高效复合碳源-多核碳源生产厂家-污水处理反硝化菌种一长隆科技库巴鲁 | 烟台条码打印机_烟台条码扫描器_烟台碳带_烟台数据采集终端_烟台斑马打印机-金鹏电子-金鹏电子 | 净化车间装修_合肥厂房无尘室设计_合肥工厂洁净工程装修公司-安徽盛世和居装饰 | 软瓷_柔性面砖_软瓷砖_柔性石材_MCM软瓷厂家_湖北博悦佳软瓷 | 洛阳网站建设_洛阳网站优化_网站建设平台_洛阳香河网络科技有限公司 | 北京征地律师,征地拆迁律师,专业拆迁律师,北京拆迁律师,征地纠纷律师,征地诉讼律师,征地拆迁补偿,拆迁律师 - 北京凯诺律师事务所 | 鼓风干燥箱_真空烘箱_高温干燥箱_恒温培养箱-上海笃特科学仪器 | 世界箱包品牌十大排名,女包小众轻奢品牌推荐200元左右,男包十大奢侈品牌排行榜双肩,学生拉杆箱什么品牌好质量好 - Gouwu3.com | 沈阳网站建设_沈阳网站制作_沈阳网页设计-做网站就找示剑新零售 沈阳缠绕膜价格_沈阳拉伸膜厂家_沈阳缠绕膜厂家直销 |