Почему вы передаете 'null' для 'apply' или 'call'?

Согласно этой ссылке JavaScript

  

Значение null - это литерал JavaScript, представляющий ноль или «пустой»   значение, т.е. значение объекта отсутствует. Это один из JavaScript   примитивные значения.

function getMax(arr){
  return Math.max.apply(null, arr);  
}

Разве передача ключевого слова this в явном виде не будет более понятной или, по крайней мере, более читаемой? Опять же, в этот момент я не могу понять, почему вы бы использовали null.

12 голосов | спросил Antonio Pavicevac-Ortiz 11 32015vEurope/Moscow11bEurope/MoscowWed, 11 Nov 2015 00:36:57 +0300 2015, 00:36:57

5 ответов


0

Вызов apply со значением null в качестве первого аргумента аналогичен вызову функции без предоставления какого-либо объекта для this

Что делает метод apply?

  

Метод apply() вызывает функцию с заданным this значение и   arguments предоставляется в виде массива (или объекта, похожего на массив).

fun.apply(thisArg, [argsArray])
  

thisArg

     

Значение этого предусмотрено для призыва к веселью. Обратите внимание, что это не может   быть фактическим значением, видимым методом: если метод является функцией в   код нестрогого режима, null и undefined будут заменены на   глобальный объект и примитивные значения будут упакованы.

Дополнительную документацию можно найти здесь .

ответил Christos 11 32015vEurope/Moscow11bEurope/MoscowWed, 11 Nov 2015 00:38:36 +0300 2015, 00:38:36
0
  

Почему вы передаете 'null' для 'apply' или 'call'?

Если нет значения, которое вы хотите указать для указателя this внутри функции, а вызываемая вами функция не ожидает конкретное значение this для правильной работы.

  

Разве не было бы явным указание ключевого слова? Или по крайней мере   более читабельный. Опять же, в этот момент я не могу понять, почему   вы бы использовали ноль.

В вашем конкретном случае, вероятно, лучше всего передать объект Math:

function getMax(arr){
  return Math.max.apply(Math, arr);  
}

Хотя оказывается, что не имеет значения, что вы передаете в качестве первого аргумента для Math.max.apply(...) (только из-за особенностей реализации Math.max()), передача Math устанавливает this указатель на ту же самую вещь, на которую он был бы установлен при вызове его обычно как Math.max(1,2,3), так что это самый безопасный вариант, поскольку лучше всего имитировать обычный вызов Math.max().

  

Почему вы передаете 'null' для 'apply' или 'call'?

Вот еще некоторые подробности ... При использовании .call() или .apply(), null можно передать, если у вас нет определенного значения, для которого вы хотите установить this, и вы знаете, что вызываемая функция не ожидает this иметь любое конкретное значение (например, он не использует this в своей реализации).

Примечание. Использование null с .apply() или .call() обычно выполняется только с функциями, которые являются методами только по причинам пространства имен, а не по объектно-ориентированным причинам. Другими словами, функция max() является методом для Math объект только по причинам пространства имен, а не потому, что объект Math содержит данные экземпляра, которые метод .max() необходим доступ.


Если бы вы делали это так:

   function foo() {
       this.multiplier = 1;
   }

   foo.prototype.setMultiplier = function(val) {
       this.multiplier = val;
   }

   foo.prototype.weightNumbers = function() {
       var sum = 0;
       for (var i = 0; i < arguments.length; i++) {
           sum += (arguments[i] * this.multiplier);
       }
       return sum / arguments.length;
   }

   var x = new foo();
   x.setMultiplier(3);
   var numbers = [1, 2, 3]
   console.log(x.weightNumbers.apply(x, numbers));

Когда метод, который вы вызываете .apply(), должен получить доступ к данным экземпляра, тогда вы ДОЛЖНЫ передать соответствующий объект в качестве первого аргумента, поэтому что метод имеет право указатель this выполнять свою работу, как ожидалось.

ответил jfriend00 11 32015vEurope/Moscow11bEurope/MoscowWed, 11 Nov 2015 00:48:10 +0300 2015, 00:48:10
0

Я немного опоздал, чтобы ответить на это. Я постараюсь дать длинное описательное объяснение здесь.

  

Что такое ноль в JavaScript?

Значение null является литералом (не может быть таким свойством глобального объекта, как undefined). Это одно из примитивных значений JavaScript.

В API-интерфейсе null часто извлекается в том месте, где можно ожидать объект, но объект не релевантен.

  

fun.apply (thisArg, [argsArray])

thisArg : это значение используется для вызова развлечения. Обратите внимание, что это может не быть фактическим значением, видимым методом: если метод является функцией в коде нестрогого режима, нулевые и неопределенные будут заменены глобальным объектом, а примитивные значения будут помещены в квадрат.

argsArray : массивоподобный объект, указывающий аргументы, с которыми должен вызываться fun, либо ноль или неопределенное значение, если никакие аргументы не должны быть предоставлены функции. Начиная с ECMAScript 5, эти аргументы могут представлять собой общий массивоподобный объект вместо массива. Смотрите ниже информацию о совместимости браузера.

  

Если вы используете «строгий режим», рекомендуется передать этот или   Математика как параметр.

ответил SyntaX 11 32015vEurope/Moscow11bEurope/MoscowWed, 11 Nov 2015 01:38:18 +0300 2015, 01:38:18
0

Один случай, когда я нашел это полезным, - это когда вызываемая функция уже связана с определенным контекстом.

Потому что связанные функции не могут быть восстановлены, и они всегда будут вызываться с помощью thisArg, который был передан в bind, бесполезно передавать thisArg в call или apply. Из источника :

  

Функция bind() создает новую связанную функцию (BF) .... Когда вызывается связанная функция, она вызывает внутренний метод ---- +: = 6 =: + ---- в [[Call]] со следующими аргументами [[BoundTargetFunction]]

Вот пример:

Call(boundThis, args)
ответил pushkin 14 32018vEurope/Moscow11bEurope/MoscowWed, 14 Nov 2018 22:20:41 +0300 2018, 22:20:41
0

Применить полезно, когда вы хотите передать ответственность за выполнение каких-либо функций функции, которая определяется во время выполнения, и передать переменное число аргументов этой функции. Вы можете иметь или не иметь какой-либо соответствующий контекст «это», когда вы делаете это.

Например, я использую написанную мной библиотеку, чтобы облегчить прослушивание и вызывать события приложения, которые применяются.

Я хотел иметь возможность поднять событие вроде этого:

EventManager.raise('some:event-name', arg1, arg2, arg3, ..);

.. и чтобы все зарегистрированные обработчики для этого события вызывались с этим списком аргументов (arg1, arg2 и т. д.). Таким образом, в функции повышения она проходит через обработчики, которые зарегистрированы для этого имени события, и вызывает их, передавая все переданные аргументы, кроме имени события, например:

var args = [];
Array.prototype.push.apply(args, arguments);
args.shift();
for (var l in listeners) {
    var listener = listeners[l];
    listener.callback.apply(listener.context, args);
}

Когда вызывается зарегистрированный обработчик (listener.callback), apply применяется для передачи переменного числа аргументов. Здесь я позволил слушателю предоставлять этот контекст для его обработчика события, когда определитель слушателя определен, но этот контекст может быть не определен или он может быть нулевым, и это совершенно нормально.

Долгое время функция повышения даже не облегчала использование контекста обратного вызова. В конце концов я столкнулся с необходимостью, поэтому я поддержал это, но в большинстве случаев мне это не нужно или не нужно использовать.

ответил Shavais 13 ThuEurope/Moscow2018-12-13T20:40:16+03:00Europe/Moscow12bEurope/MoscowThu, 13 Dec 2018 20:40:16 +0300 2018, 20:40:16

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132