0

在 Azure Pipelines 任务库中,通过 apply()调用了 path.resolve() ,但我不太明白:

var absolutePath = path.resolve.apply(this, pathSegments);

在哪里pathSegments: any[]

上面的代码在模块范围内导出的函数中,所以(如果我理解正确的话)this将引用模块本身。但是我不知道通过调用apply而不是path.resolve()直接调用的效果是什么。谁能解释一下?

上下文:我怀疑这可能与模拟有关 -在等效的模拟模块中有一个类似的功能path.posix.resolve.apply(),它使用. 我的根本问题是,当我调用模拟的tl.resolve('')- 间接 via tl.filePathSupplied()- 它返回实际的 cwd 而不是模拟的 via TaskLibAnswers

4

1 回答 1

2

任何函数上的.apply()方法都为您提供了两个功能:

  1. 它允许您在this调用函数时设置值。
  2. 它允许您传递任意参数数组,当调用函数时,这些参数将被解压缩为实际参数(而不是数组)。

在这种情况下,它很可能是这里使用的特征 #2,因为它path.resolve()接受任意数量的参数。如果您没有使用最新版本的 node.js 或编码到较低级别的 Javascript 支持,因此没有扩展运算符,那么.apply()当参数以数组的形式传递给您。

如果您查看模块的path代码并找到该resolve()函数的代码,您会发现它根本不使用this值,因此该path对象仅用作命名空间对象。因此,您可以将任何this您想要的值发送到 resolve 函数中,这没有任何区别。

因此,代码可能.apply()不是使用它来设置 的值this,而是它可以将任意参数数组传递给函数。

但是我不知道通过 apply 而不是直接调用 path.resolve() 调用的效果是什么。谁能解释一下?

如果您向我们展示了更多周围的代码,我们可以更确定地回答,但该变量似乎pathSegments已经是该代码想要传递给的路径值数组path.resolve()。如果这是一个任意数组,那么将该数组作为单独参数传递给的两种最简单的方法path.resolve()是:

path.resolve.apply(path, pathSegments)

path.resolve(...pathSegments)

如果此代码是在考虑到没有...语法的较旧目标时编写的,那么该.apply()选项将是最简单的方法。

于 2020-02-24T08:21:32.307 回答