Javascript 使用数组调用apply
我发现一篇文章使用了以下nodeJs函数: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;
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