有人可以在javascript示例中解释这个“传递参数”吗?

时间:2014-03-05 15:06:34

标签: javascript function arguments call apply

我正在阅读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如何工作和/或使代码更快?

3 个答案:

答案 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]]