Javascript 使用数组调用apply

Javascript 使用数组调用apply,javascript,node.js,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;

我发现一篇文章使用了以下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;
function foo (arg) { console.log(arg); }
由于我不知道如何使用
调用
应用
,所以我做了一些测试/研究,但仍然有一些东西我没有得到:返回语句

我试着把它换成

return path.join([_root].concat(args))
但我得到了:

抛出新类型错误('路径必须是字符串。已接收'+ 检查(路径)

好的,那么传递给
path.join
的参数必须是
字符串,这很公平,但是
apply
函数将其作为数组传递,那么它如何工作呢

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

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;
function foo (arg) { console.log(arg); }
我这样称呼它:

foo.apply(foo, ["plop", "plip"])
但是我只得到了“plop”,所以我不明白如果只得到数组的第一项,
path.join
是如何工作的。我还尝试显示
参数
,但是我得到了一个数组,而不是一个字符串


基本上,当我直接调用
path.join
时,我不明白为什么作为参数传递的数组会被接受为字符串。假设您有一个
常量arr=['a','b','c']

当您调用
path.join.apply(path,arr)
时,它会分散,与调用
path.join('a','b','c')

.apply
传播参数。因此,您的函数应该类似于
函数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')


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

  • 您可以动态调用函数,根据变量决定调用哪个函数
  • 您可以定义另一个上下文。第一个参数是可以传递的上下文,它在函数体中表示为
    this

  • 以下是和的文档页面。

    假设您有一个数组
    const arr=['a','b','c']

    当您调用
    path.join.apply(path,arr)
    时,它会分散,与调用
    path.join('a','b','c')

    .apply
    传播参数。因此,您的函数应该类似于
    函数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')


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

  • 您可以动态调用函数,根据变量决定调用哪个函数
  • 您可以定义另一个上下文。第一个参数是可以传递的上下文,它在函数体中表示为
    this

  • 以下是和的文档页。

    绝对正确。我不仅仅想补充一点,apply和call之间的唯一区别在于参数的传递方式。Apply-array和call-just逗号分隔。因此,如果我理解得很好,它可以工作,因为数组在
    path.join
    的参数中分布。但是在这种情况下,这个函数如何访问这些参数,因为它们的编号可以是动态的(
    path.join('a','b')
    path.jon('a','b','c')
    )。我猜它使用了
    参数
    ,这是一个类似于数组的数组,那么当我直接在其中传递一个实数组时,为什么它不起作用呢?是因为在第一种情况下,
    参数
    将包含字符串项,而在第二种情况下,它将包含字符串数组吗?因为
    路径
    是一个数组。它不使用参数作为输入,只使用第一个参数作为“胶水”。看看这个例子,对不起,我不明白<代码>路径
    是节点包,不是数组。啊,很抱歉。你是对的。因此,是的,
    path.join
    可以在join函数中使用
    arguments
    变量。或者像
    函数文本(…rest){}
    (您也可以编写另一个名称,而不是
    rest
    绝对正确。我想补充的是,apply和call之间的唯一区别在于参数的传递方式。apply-array和call-just是逗号分隔的。因此,如果我理解得很好,它可以工作,因为数组在
    path.join
    的参数中分布。但是在这种情况下,此函数如何访问这些参数,因为它们的编号可以是动态的(
    path.join('a','b')
    path.jon('a','b','c')
    )。我猜它使用了
    参数
    ,这是一个类似于数组的数组,那么当我直接在其中传递一个实数组时,为什么它不起作用呢?是因为在第一种情况下,
    参数
    将包含字符串项,而在第二种情况下,它将包含字符串数组吗?因为
    路径
    是一个数组。它不使用参数作为输入,而是只有第一个参数是“glue”。看看这个例子,很抱歉,但我不明白…
    path
    是节点包,而不是数组。啊,很抱歉。你是对的。是的,
    path.join
    可以在join函数中使用
    参数
    变量。或者像
    函数文本(…rest){}这样编写的ES6 rest语句(您也可以编写另一个名称,而不是
    rest