我正在阅读Javascript Garden,我正试图围绕以下示例:
传递参数
以下是将参数从一个函数传递到另一个函数的推荐方法。
function foo() { bar.apply(null, arguments); } function bar(a, b, c) { // do stuff here }
另一个技巧是同时使用call和apply来创建快速,未绑定的包装器。
function Foo() {} Foo.prototype.method = function(a, b, c) { console.log(this, a, b, c); }; // Create an unbound version of "method" // It takes the parameters: this, arg1, arg2...argN Foo.method = function() { // Result: Foo.prototype.method.call(this, arg1, arg2... argN) Function.call.apply(Foo.prototype.method, arguments); };
我想弄清楚两件事:
1)“未绑定的包装器”究竟是什么?
2)从.call链接到.apply如何工作和/或使代码更快?
答案 0 :(得分:1)
“1)”未绑定的包装器“究竟是什么?”
Unbound wrapper只是一个通过传递所需的this
值和参数来调用另一个函数的函数。
“2)从.call到.apply的链接如何工作和/或使代码更快?”
.call.apply()
比.slice()
上的arguments
更快,以便将this
与实际的args分开。
否则它需要这样做,这是慢的:
Foo.method = function(ths) {
Foo.prototype.method.apply(ths, Array.prototype.slice.call(arguments, 1));
};
答案 1 :(得分:1)
“未绑定的包装器”究竟是什么?
一个不在实例上调用的函数,但以实例作为其参数。它没有绑定到原型/不需要绑定到实例。例如:
var x = new Foo;
// instead of
x.method(1, 2, 3);
// you now call
Foo.method(x, 1, 2, 3);
这样做的好处是你可以在不关心this
背景的情况下传递函数。
从.call到.appall的链接如何工作和/或使代码更快?
它并没有真正使“更快”。它甚至没有与任何“慢速”解决方案相比。
有关其工作原理,请查看重复的问题What's the meaning to chain call and apply together?。
答案 2 :(得分:0)
我认为代码应该是这样的:
function Foo() {}
Foo.prototype.method = function(a, b, c) {
console.log(this, a, b, c);
};
Foo.method = function() {
//Notice this line:
Function.apply.call(Foo.prototype.method, this, arguments);
};
然后
Foo.method(1,2,3) => function Foo() {} 1 2 3
其他例子:
Function.apply.call(Array,this,[1,2]) => [1, 2]
Function.call.apply(Array,this,[1,2]) => [window]
Function.call.call(Array,this,[1,2]) => [[1, 2]]