国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

js的Thunk函數的含義

史占廣 / 1708人閱讀

摘要:在語言中,函數替換的不是表達式,而是多參數函數,將其替換成一個只接受回調函數作為參數的單參數函數。它的源碼主要多了一個檢查機制,變量確保回調函數只運行一次請看下面的例子。

Thunck函數的含義

編譯器的傳名調用實現,往往是將參數放到一個臨時函數之中,再將這個臨時函數傳入函數體。這個臨時函數就叫做Thunk函數。

function f(m){
    return m*2;
}
f(x+5);
//等同于
var thunk = function(){
    return x+5;
};
function f(thunk){
    return thunk()*2;
}

上面代碼中,函數f的參數x+5被一個函數替換了。凡是用到原參數的地方,對Thunk函數求值即可。
這就是thunk函數的定義,它是傳名調用的一種實現策略,用來替換某個表達式。

JavaScript語言的Thunk函數

JavaScript語言是傳值調用,它的Thunck函數含義有所不同。在JavaScript語言中,Thunk函數替換的不是表達式,而是多參數函數,將其替換成一個只接受回調函數作為參數的單參數函數。

//正常版本的readFile(多參數版本)
fs.readFile(fileName,callback);
//Thunk版本的readFile(單參數版本);
var Thunk = function(fileName){
    return function(callback){
        return fs.readFile(fileName,callback);
    };
};
var readFileThunk = Thunk(fileName);
readFileThunk(callback);

上面代碼中,fs模塊的readFile方法是一個錯參數函數,兩個參數分別為文件名和回調函數。經過轉換器處理,它變成了一個但參數函數,只接受回調函數作為參數。這個單參數版本,就叫做Thunk函數。
任何函數,只要參數有回調函數,就能寫成Thunk函數的形式。下面是一個簡單的Thunk函數轉換器。

//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函數。
var readFileThunk = Thunk(fs.readFile);
readFileThunk(fileA)(callback)
Thunkify模塊

生產環境的轉換器,建議使用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確保回調函數只運行一次,請看下面的例子。

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只允許回調函數執行一次,所以只輸出一行結果。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/99611.html

相關文章

  • callback

    摘要:前言入門阮一峰另類的實現同級別的另外一個函數。該事件系統允許代碼定義應用程序的特定事件,該事件可以傳遞自定義參數,自定義參數包含訂閱者所需要的值。其目的是避免訂閱者和發布者產生依賴關系。狀態轉變不可逆。方法必須返回一個。 callback 前言 ECMAScript 6入門(阮一峰) showImg(https://segmentfault.com/img/remote/1460000...

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

    摘要:捕抓信息,并且出錯時,傳遞給回調函數回調函數應該只調用一次。總結在學習一個概念或者一個模塊時,測試代碼加深你對知識的理解和掌握。 一步步打造thunkify 本文的思路: 學習thunk相關知識,主要參考阮一峰的介紹 一步步實現thunkify模塊,并且使用測試用例來完善我們的代碼,打造出一個健壯的模塊 1. 誕生背景 Thunk函數的誕生是源于一個編譯器設計的問題:求值策略,即函...

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

    摘要:的異步完成整個異步環節的有事件循環觀察者請求對象以及線程池。執行回調組裝好請求對象送入線程池等待執行,實際上是完成了異步的第一部分,回調通知是第二部分。異步編程是首個將異步大規模帶到應用層面的平臺。 showImg(https://segmentfault.com/img/remote/1460000011303472); 本文首發在個人博客:http://muyunyun.cn/po...

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

    摘要:在語言中,函數替換的不是表達式,而是多參數函數,將其替換成一個只接受回調函數作為參數的單參數函數。為什么里面必須使用函數呢,因為我們需要確保傳入的值只有一個,利用其回調函數,來進行遞歸自動控制函數的流程,接收和交還程序的執行權 前言 這篇文章主要是梳理一下自己對阮一峰大神寫的關于async/await文章,有寫得不對的地方以及理解得不對的地方,各位大佬請指錯! 對比 簡單對比傳統異步,...

    Magicer 評論0 收藏0
  • 理解通過thunk函數自動執行generator函數

    摘要:總結執行方法本質上相當于注冊一個回調函數,而函數結合函數就是一種更直觀的注冊回調函數的方式。函數負責異步執行交出執行權,而函數負責注冊回調返回執行權,執行下一步,兩者結合從而自動執行函數。 今天又看了一遍阮一峰老師的《Thunk 函數的含義和用法》,這里整理一下自己的理解: 在 JavaScript 語言中,Thunk 函數替換的不是表達式,而是多參數函數,將其替換成單參數的版本,且只...

    int64 評論0 收藏0

發表評論

0條評論

史占廣

|高級講師

TA的文章

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