成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

js的Thunk函數(shù)的含義

史占廣 / 1718人閱讀

摘要:在語言中,函數(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語言的Thunk函數(shù)

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

相關(guān)文章

  • callback

    摘要:前言入門阮一峰另類的實(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...

    tianren124 評論0 收藏0
  • Thunk深入解析

    摘要:捕抓信息,并且出錯時,傳遞給回調(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ì)的問題:求值策略,即函...

    xi4oh4o 評論0 收藏0
  • Node.js 異步異聞錄

    摘要:的異步完成整個異步環(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...

    zzbo 評論0 收藏0
  • 淺談async·await

    摘要:在語言中,函數(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)異步,...

    Magicer 評論0 收藏0
  • 理解通過thunk函數(shù)自動執(zhí)行g(shù)enerator函數(shù)

    摘要:總結(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ù)的版本,且只...

    int64 評論0 收藏0

發(fā)表評論

0條評論

史占廣

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<