js将附加参数传递给函数

时间:2015-12-22 19:15:41

标签: javascript

我有以下代码:

    var createThumb128 = function(fileObj, readStream, writeStream) {
        gm(readStream, fileObj.name()).resize('128', '128').stream().pipe(writeStream);
    };

    var store = new FS.Store.GridFS("thumbs_128", { transformWrite: createThumb128})

如何用传递给createThumb函数的参数替换硬编码的128大小字符串?

我假设我不能只添加附加参数,因为transformWrite属性需要一个具有特定3参数签名的函数。

4 个答案:

答案 0 :(得分:2)

你可以尝试" Currying" https://en.wikipedia.org/wiki/Currying

var createThumb = function(size) {
    return function(fileObj, readStream, writeStream) {
        gm(readStream, fileObj.name()).resize(size, size).stream().pipe(writeStream);
    };
}

var store = new FS.Store.GridFS("thumbs_128", { transformWrite: createThumb('128')})

答案 1 :(得分:2)

如果transformWrite期望给定三个参数,则必须提供相应的功能。但是,您可以使用所需的大小参数创建这样的函数。

您需要的是一个创建另一个功能的功能:

var makeCreateThumb = function(param) {
    return function(fileObj, readStream, writeStream) {
        gm(readStream, fileObj.name())
            .resize(param, param)
            .stream()
            .pipe(writeStream);
    };
}

像这样使用:

var store = new FS.Store.GridFS("thumbs_128", { 
    transformWrite: makeCreateThumb('128')
})

答案 2 :(得分:0)

使用@TongShen建议的curryingbind

bind允许您使用n个参数执行一个函数,bind您可以获得n-x函数,您可以在其中修复第一个n

对于您的情况,将其设为4参数函数:

 var createThumb128 = function(len, fileObj, readStream, writeStream) {
        gm(readStream, fileObj.name()).resize(len, len).stream().pipe(writeStream);
    };

然后创建一个3参数副本,修复'128'长度,然后发送:

var lengthFixed128 = createThumb128 .bind(undefined, '128'); //first argument binds to a context, can be left undefined for our purpose

var store = new FS.Store.GridFS("thumbs_128", { transformWrite: lengthFixed128 })

答案 3 :(得分:0)

第一个选项是返回一个函数。

function abc (_custom) {
  return function (a, b, c) {
      console.log(arguments, _custom);
  }
}

var x = abc();
console.log(x(1,2,3));

另一种选择是使用bind

function abc (_custom, a,b,c) {
  console.log(arguments);
}

var x = abc.bind(this, 128);
x(1,2,3)