该函数需要3个参数,如
function p(x,y,z){
console.log(arguments);
}
所以我们称之为 p(12,21,32)
第四个论点应该如56所说。
如此有效的呼叫应该是p(12,21,32,56)
怎么做?
条件我们无法更改功能定义。我需要将第四个参数部分绑定为类似
的56P = p.bind(此,'''''' 56); 或使用lodash
然后再调用p
P(12,21,32);
这样56应该默认通过
答案 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);