使用数组调用apply

时间:2017-07-04 08:33:47

标签: javascript node.js

我发现了一篇使用以下nodeJs函数的文章:

var path = require('path');

var _root = path.resolve(__dirname, '..');

function root(args) {
    args = Array.prototype.slice.call(arguments, 0);
    return path.join.apply(path, [_root].concat(args));
}

exports.root = root;

由于我不知道如何使用callapply,我做了一些测试/研究,但仍然有一些我没有得到的:return语句。< / p>

我试图用

替换它
return path.join([_root].concat(args))

但我得到了:

  

抛出新的TypeError('Path必须是一个字符串。收到'+   检查(路径));

好的,所以传递给path.join的参数必须是string,公平,但apply函数将其作为数组传递,那么它怎么能起作用?

为了验证这一点,我创建了这个简单的函数:

function foo (arg) { console.log(arg); }

我这样称呼它:

foo.apply(foo, ["plop", "plip"])

但是我只是得到了“plop”,所以我不明白path.join如果它只获得数组的第一项,它是如何工作的。我也尝试显示arguments,但后来我得到了一个数组,而不是字符串。

基本上,我不明白为什么作为参数传递的数组被接受为字符串,而不是直接调用path.join时。

1 个答案:

答案 0 :(得分:3)

假设您有一个const arr = [ 'a', 'b', 'c' ]数组 当你拨打path.join.apply( path, arr )时,它会被传播,并且与呼叫
相同 path.join( 'a', 'b', 'c' )

.apply传播参数。所以你的函数应该看起来像function foo( arg1, arg2 ) { /* ... */ }

如果您希望在一个变量中传递给函数的所有参数,请像这样使用arguments

function test( arg1, arg2 ) {
  console.log( arg1, arg2 );
  console.log( arguments );
}

test.apply( null, [ 'a', 'b' ] );
另一方面,

.call只调用带有分隔参数的函数。 因此,在我们的示例中,您需要执行test.call( null, 'a', 'b' );

那么我为什么要使用callapply那么,可能会有比我在这里提到的更多的原因,但是

  1. 您可以动态调用函数,根据变量决定调用哪个函数。
  2. 您可以定义另一个上下文。第一个参数是您可以传递的上下文,在函数体内表示为this
  3. 以下是applycall的文档页面。