日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

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

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

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

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

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

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

首先什么是 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)用比較簡單,但是如果計算后的結(jié)果沒有在程序中使用的話,損失就有點大。因此有很多場景都傾向于傳名調(diào)用。

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

比較常見的是將想要傳名調(diào)用的參數(shù)放到一個臨時函數(shù)之中,把臨時函數(shù)當(dāng)做參數(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í)行結(jié)果:

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í)行權(quán)交給下一個協(xié)程,那么就需要有一種方法把執(zhí)行權(quán)在交還給當(dāng)前函數(shù)

這種方法就是 Thunk 函數(shù),因為它可以重新包裝回調(diào)函數(shù),我們可以自己寫包裝函數(shù),將執(zhí)行權(quán)交還給 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);//結(jié)束協(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進(jìn)行包裝,形成 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的時機(jī)了

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

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

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

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

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

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

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

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

標(biāo)簽: JavaScript
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
久久国产电影| 日韩国产综合| 91精品高清| 精品一区三区| 欧美成人综合| 女人av一区| 久久精品二区三区| 久久视频精品| 国产亚洲在线观看| 亚洲免费毛片| 欧美日韩午夜| 国产一区二区三区四区五区传媒| 久久av综合| 欧美国产偷国产精品三区| 91精品国产调教在线观看| 影音先锋久久| 日韩中文字幕| 久久国产婷婷国产香蕉| 精品国产午夜| 桃色一区二区| 女同性一区二区三区人了人一| 黄毛片在线观看| 国产精久久一区二区| 国产精品一区二区精品| 久久久免费人体| 天堂√中文最新版在线| 今天的高清视频免费播放成人| 亚洲免费黄色| 欧美久久久网站| 成人在线视频区| 女人天堂亚洲aⅴ在线观看| 免费看黄色91| 美日韩一区二区三区| 电影亚洲精品噜噜在线观看 | 欧美1区2区3| 久久久久欧美精品| 亚洲免费毛片| av资源新版天堂在线| 亚洲免费高清| 国产精品主播在线观看| 激情欧美日韩一区| 日产欧产美韩系列久久99| 精品丝袜久久| 不卡视频在线| 国产精品一区二区三区四区在线观看| 日韩免费福利视频| 日本国产亚洲| 日韩一区网站| 麻豆精品视频在线| 在线手机中文字幕| 久久福利影视| 国产专区精品| 视频一区二区三区在线| 开心激情综合| 亚洲一区二区三区高清| 精品视频国产| 蜜臀av国产精品久久久久| 精品一区二区三区视频在线播放| 激情欧美亚洲| 国产经典一区| 亚洲欧美网站| 四虎成人av| 日韩激情网站| 一区三区视频| 欧美成人精品午夜一区二区| 狠狠操综合网| 精品少妇av| 日韩高清不卡在线| 影音先锋国产精品| 98精品视频| 欧美天堂一区二区| 99在线精品免费视频九九视| 理论片午夜视频在线观看| 欧美天堂在线| 久久xxxx精品视频| 欧美三区四区| 欧美日韩亚洲一区三区| 亚洲在线观看| 日本久久综合| 在线看片日韩| 99精品视频精品精品视频| 国产精品久久久久9999高清| 欧美天堂亚洲电影院在线观看| 国产精品亲子伦av一区二区三区 | 国产调教精品| 尤物网精品视频| 国产乱码午夜在线视频| 日韩在线观看中文字幕| 欧美日韩国产亚洲一区| 亚洲欧洲高清| 国产精品一级在线观看| 亚洲精品一区二区在线播放∴| 国产99久久久国产精品成人免费| 国产精品久久久久毛片大屁完整版| 欧美中文字幕| 午夜精品一区二区三区国产| 亚洲va中文在线播放免费| 精品视频自拍| 国产精品一线天粉嫩av| 日韩一区二区三免费高清在线观看 | 91精品xxx在线观看| 美女精品视频在线| 911精品国产| 日韩国产高清在线| 日本在线成人| 久久久久久色| 亚洲深夜影院| 免费久久久久久久久| 色爱av综合网| 精品欧美一区二区三区在线观看| 久久精品国产免费| 久久精品一本| 精品视频高潮| 首页国产精品| 伊人久久在线| 欧美三级精品| 99久久婷婷| 欧美.日韩.国产.一区.二区 | 国产激情在线播放| 国产黄大片在线观看| 吉吉日韩欧美| 九色porny丨国产首页在线| 日韩在线观看不卡| 国产一区清纯| 中文精品在线| 亚洲欧美久久精品| 日韩一区免费| 国产精品网址| 精品视频网站| 成人在线丰满少妇av| 日韩电影免费在线观看| 丝袜诱惑一区二区| 亚洲天堂资源| 日韩国产欧美在线视频| 综合色就爱涩涩涩综合婷婷| 久久国产成人| 久久成人精品| 亚洲永久精品唐人导航网址| 免费看黄色91| 久久精品av麻豆的观看方式| 国产午夜精品一区在线观看| 国产精品久久久免费| 精品免费av一区二区三区| 成人日韩在线| 亚洲午夜电影| 伊人国产精品| 欧美天堂在线| 日韩中文av| 国产精品成人3p一区二区三区| 久久精品99国产精品日本| 欧美国产亚洲精品| 高清av一区| 日本成人中文字幕在线视频| 国产精品一线| 日本va欧美va瓶| 欧美日中文字幕| 午夜在线精品偷拍| 蜜臀久久99精品久久久久久9| 日韩一区二区三区四区五区| 国产精品黄色片| а√天堂8资源在线| 亚洲精品国产偷自在线观看| 99国产精品自拍| 视频一区日韩精品| 精品亚洲成人| 中文亚洲免费| 五月激激激综合网色播| 国产精品一区二区免费福利视频| 91综合网人人| 午夜在线视频观看日韩17c| 国产精品视频一区二区三区四蜜臂 | 欧美视频久久| 日韩电影免费网址| 免费人成精品欧美精品| 精品九九久久| 久久高清一区| 嫩草伊人久久精品少妇av杨幂| 欧美日韩一二| 欧美午夜三级| 久久精品av| 国产精品对白| 视频一区在线播放| 日韩1区2区| 亚洲资源网站| 欧美一级鲁丝片| 亚洲三级国产| 黑人精品一区| 国产日本精品| 国产免费成人| 97人人精品| 日韩高清二区| 亚洲美洲欧洲综合国产一区| 精品国产亚洲一区二区三区在线 | 日本国产欧美| 久久国产日本精品| 国产精品乱战久久久| 免费精品视频| 日韩不卡在线| 国产激情一区| 丝袜美腿一区二区三区|