Каков эффект вызова path.resolve() через path.resolve.apply(this, ...)?

В библиотеке задач Azure Pipelines есть вызов path.resolve() через apply(), который я не совсем понимаю:

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

где pathSegments: any[]

Приведенный выше код находится в функции, экспортированной в области модуля, поэтому (если я правильно понимаю) thisбудет относиться к самому модулю. Но я не понимаю, каков эффект звонка черезapply а не просто звонить path.resolve()прямо. Кто-нибудь может объяснить?

Контекст: я подозреваю, что это может быть связано с издевательством - аналогичная функция есть в эквивалентном модуле mock, который используетpath.posix.resolve.apply(). Моя основная проблема в том, что когда я вызываюtl.resolve('') - косвенно через tl.filePathSupplied() - он возвращает фактический cwd, а не тот, который издевался через TaskLibAnswers.

1 ответ

Решение

В .apply() Метод любой функции дает вам две возможности:

  1. Это позволяет вам установить this значение при вызове функции.
  2. Он позволяет передавать произвольный массив аргументов, которые будут распакованы в фактические аргументы (не в массив) при вызове функции.

В этом случае, вероятно, здесь используется функция №2, потому что path.resolve()принимает произвольное количество аргументов. Если вы не используете последние версии node.js или кодируете более низкий уровень поддержки Javascript и, следовательно, не имеете оператора распространения, тогда.apply() было бы естественным способом передать произвольное количество аргументов функции, когда аргументы были переданы вам в виде массива.

Если вы посмотрите на источникpathмодуль и найдите код дляresolve() функция, вы обнаружите, что она не использует this ценность вообще так pathобъект используется ТОЛЬКО как объект пространства имен. Таким образом, вы можете отправить любое значениеthis вы хотите использовать функцию разрешения, и это не будет иметь никакого значения.

Итак, вероятно, код использует .apply() не так, чтобы он мог установить значение this, но чтобы он мог передать функции произвольный массив аргументов.

Но я не понимаю, каков эффект от вызова через apply, а не от прямого вызова path.resolve(). Кто-нибудь может объяснить?

Если бы вы показали нам больше окружающего кода, мы могли бы ответить с большей уверенностью, но кажется вероятным, что pathSegments переменная уже является массивом значений пути, которые этот код хочет передать path.resolve(). Если это произвольный массив, то два простейших способа передать этот массив как отдельные аргументы вpath.resolve() являются:

path.resolve.apply(path, pathSegments)

а также

path.resolve(...pathSegments)

Если этот код был написан с учетом более старой цели, в которой не было ... синтаксис, затем .apply() вариант будет самым простым способом сделать это.

Другие вопросы по тегам