Как скобки в этом Javascript-коде Node.JS влияют на последующий вызов метода? [Дубликат]

Исключение нулевого указателя генерируется, когда приложение пытается использовать null в случае, когда требуется объект. К ним относятся:

  1. Вызов метода экземпляра объекта null.
  2. Доступ или изменение поля объекта null.
  3. Принимая длину null, как если бы это был массив.
  4. Доступ или изменение слотов null, как если бы это был массив.
  5. Бросок null как будто это было значение Throwable.

Приложения должны бросать экземпляры этого класса, чтобы указать на другие незаконные использования объекта null.

Ссылка: http://docs.oracle.com/javase/8/docs/api/java/lang/NullPointerException.html

81
задан Will Smith 28 August 2015 в 15:56
поделиться

2 ответа

(0, _b.a)() гарантирует, что функция _b.a вызывается с this, установленным для глобального объекта (или если строгий режим включен, undefined). Если вы должны были называть _b.a() напрямую, то _b.a вызывается с this, установленным на _b.

(0, _b.a)(); эквивалентно

0; // Ignore result
var tmp = _b.a;
tmp();

( , является оператором запятой, см. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Comma_Operator ).

109
ответ дан Rob W 18 August 2018 в 22:22
поделиться
  • 1
    спасибо за ссылку. так много раз проходил и наконец решил узнать, что происходит. – Thomas McCabe 24 May 2016 в 19:51
  • 2
    @RobW Я думаю, что добавление var _a = (0, _b.a) в начало файла, а затем вызов _a будет экономить больше места во многих случаях, любая идея, что они этого не сделали? – Andy 28 August 2016 в 23:47
  • 3
    @Andy Ваше предложение может иметь побочные эффекты, например. когда _b.a является (динамическим) геттером. – Rob W 29 August 2016 в 17:37
  • 4
    @RobW Я вижу, поэтому вы говорите, что идея заключается в том, чтобы избежать потенциальных побочных эффектов, пока функция не будет вызвана. – Andy 30 August 2016 в 03:47
  • 5
    Обратите внимание, что модули всегда строгие, поэтому всегда this === undefined, и вам даже не нужно упоминать глобальный объект – Bergi 16 September 2016 в 12:30

Оператор запятой оценивает каждый из своих операндов (слева направо) и возвращает значение последнего операнда.

console.log((1, 2)); // Returns 2 in console
console.log((a = b = 3, c = 4)); // Returns 4 in console

Итак, посмотрим пример:

var a = {
  foo: function() {
    console.log(this === window);
  }
};

a.foo(); // Returns 'false' in console
(0, a.foo)(); // Returns 'true' in console

Теперь в foo метод this равен a (потому что foo присоединен к a). Поэтому, если вы вызываете a.foo(), он будет записывать false в консоли.

Но если вы звонили (0, a.foo)(). Выражение (0, a.foo) будет оценивать каждый из его операндов (слева направо) и возвращает значение последнего операнда. Другими словами, (0, a.foo) эквивалентен

function() {
  console.log(this === window);
}

. Поскольку эта функция больше не привязана ни к чему, ее this является глобальным объектом window. Вот почему он записывает true в консоли при вызове (0, a.foo)().

13
ответ дан Huong Hk 18 August 2018 в 22:22
поделиться
Другие вопросы по тегам:

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