javascript:默认情况下,总是将函数中的第n个参数作为固定值传递

时间:2015-06-23 02:03:07

标签: javascript lodash

该函数需要3个参数,如

function p(x,y,z){
 console.log(arguments);
}

所以我们称之为 p(12,21,32)

第四个论点应该如56所说。

如此有效的呼叫应该是p(12,21,32,56)

怎么做?

条件我们无法更改功能定义。我需要将第四个参数部分绑定为类似

的56

P = p.bind(此,'''''' 56);  或使用lodash

然后再调用p

P(12,21,32);

这样56应该默认通过

4 个答案:

答案 0 :(得分:6)

您可以使用_.partialRight()创建一个新参数,将参数附加到原始函数的末尾:

function p(a, b, c)
{
  alert([].join.call(arguments, ','));
}

p = _.partialRight(p, 56);
p(1,2,3); // 1,2,3,56
<script src="https://raw.githubusercontent.com/lodash/lodash/3.9.3/lodash.js"></script>

要准确指定额外参数的位置,您可以使用占位符:

p = _.partialRight(p, _, _, _, _, _, _, 56); // add 56 as 7th arg
p(1,2,3); // 1,2,3,,,,56

答案 1 :(得分:1)

p = (function() {
    var old_p = p;
    return function(a, b, c) {
        return old_p(a, b, c, 56);
    };
})();

我们记住名为p的{​​{1}}旧版本,因此即使我们重新定义old_p,我们也可以调用它。我们在IIFE中执行此操作,以便p不会污染全局范围。然后,我们返回一个函数(分配给old_p),该函数返回使用额外参数调用p的结果。

我们可以使这更通用,创造&#34;绑定&#34;为任何函数调用添加额外参数的函数。下面我使用ES6语法,尤其是spread old_p运算符。但是,您可以通过操纵...对象并使用arguments来完成相同的操作:

apply

如果涉及的功能是一个对象的方法,那么通过&#34;传递&#34;这样,新函数可以被称为function bind_with_arguments_at_end(f, ...extra_args) { return function(...args) { return f(...args, ...extra_args); } } ,事情继续发挥作用。这样做,我们可以使用this.bound_func

call

答案 2 :(得分:1)

您可以创建一个新功能,使用apply将其参数重定向到原始参数,但使用Object.assign覆盖其中一些参数:

function fixArguments(f, args) {
  return function() {
    return f.apply(this, Object.assign([].slice.call(arguments), args));
  };
}
p = fixArguments(p, {3: 56}); // Overwrite the 4th argument with 56

function fixArguments(f, args) {
  return function() {
    return f.apply(this, Object.assign([].slice.call(arguments), args));
  };
}
function p(x,y,z){
  console.log(arguments);
}
p = fixArguments(p, {3: 56});
p(12,21,32);

答案 3 :(得分:0)

制作原件的副本并覆盖名称,并使用新参数调用原件。

function p(a,b,c,d) {
   console.log(arguments);
}

(function (){
    var org_p = p;  //copy original
    p = function() {  //override p
        var args = [].slice.call( arguments );  //turn arguments in to array
        args.push(56);  //add the 4th argument
        return org_p.apply( this, args );  //call the original with the updated arguments.
    }
}());

p(1,2,3);