我发现了一篇使用以下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;
由于我不知道如何使用call
和apply
,我做了一些测试/研究,但仍然有一些我没有得到的: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
时。
答案 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' );
那么我为什么要使用call
或apply
?那么,可能会有比我在这里提到的更多的原因,但是