美文网首页
js中的thunk函数

js中的thunk函数

作者: 壹豪 | 来源:发表于2019-08-22 18:57 被阅读0次

    thunk是一个很早就出现了的函数,主要的作用是实现传名调用,先简单介绍一下thunk的作用
    例如:

    var x=1;
    
    function f(n){
        return n*2;
    }
    
    f(x+1);
    

    传值调用等同于f(2);
    传名调用等同于(1+1)*2
    看起来似乎没有什么区别
    但是如果函数改成这个样子

    var x=1;
    
    function f(n){
        return 1;
    }
    
    f(x+1);
    

    这时候传值调用会先计算x+1=2然后把结果传进去,这样就经过了计算x+1但是最后并没有使用到这个参数
    传名调用就直接传入x+1然后返回1,并没有进行x+1的计算,省下了计算的时间
    thunk就是为了实现传名调用
    由于本文是讲js中的thunk函数,所以就科普到这里,接下来进入正题

    js中的thunk函数

    参考自阮一峰的解释

    JavaScript语言是传值调用,但是它的thunk函数含义有所不同,在js中,thunk函数替换的不是表达式,而是把多参数函数转换成单参数的版本,且只接受回调函数作为参数

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

    上面代码中,fs 模块的 readFile 方法是一个多参数函数,两个参数分别为文件名和回调函数。经过转换器处理,它变成了一个单参数函数,只接受回调函数作为参数。这个单参数版本,就叫做 Thunk 函数。

    任何函数,只要参数有回调函数,就能写成 Thunk 函数的形式。下面是一个简单的 Thunk 函数转换器。

    var Thunk = function(fn){
        return function (){
            var args = Array.prototype.slice.call(arguments);
            return function (callback){
                args.push(callback);
                return fn.apply(this, args);
            }
        };
    };
    

    使用上面的转换器,生成 fs.readFile 的 Thunk 函数。

    var readFileThunk = Thunk(fs.readFile);
    readFileThunk(fileA)(callback);
    

    相关文章

      网友评论

          本文标题:js中的thunk函数

          本文链接:https://www.haomeiwen.com/subject/yuyosctx.html