LINUX.ORG.RU

JavaScript void operator

 


0

1

The void operator evaluates the given expression and then returns undefined.

void function test() {
  console.log('test function executed');
};
try {
  test();
} catch (e) {
  console.log('test function is not defined');
  // Expected output: "test function is not defined"
}

Почему функция в итоге не будет объявлена? Ведь void оператор только возвращает undefined, но ведь он всё же вычисляет выражение...

Ответ на: комментарий от ddidwyll

Ну тут понятно, почему undefined: оператор void вернул его. В моём же примере – игнорируется то, что возвращает void, а функцию я ожидаю в глобальном скоупе по факту её объявления.

metalbeaver
() автор топика
Ответ на: комментарий от metalbeaver

Ну по логике в void function test ..., исполняется выражение объявляющее функцию, её результат (undefined) попадает в void, который тоже возвращает undefined. Что ты хочешь от этого получить?

ddidwyll ★★★★
()
Последнее исправление: ddidwyll (всего исправлений: 1)

Потому что void принимает expression, а не declaration.

Если ты сделаешь

0, function test() {
  console.log('test function executed');
}

То результат будет тем же.

Читать разницу между выражениями и объявлениями. Управляющими конструкциями и операторами. Безотносительно js. Разница между этими вещами есть в любом императивном языке программирования.

javascript
()
Последнее исправление: javascript (всего исправлений: 1)
Ответ на: комментарий от javascript

Понял. Интересно, а зачем такой пример в документации. Если с тем же успехом можно, например, перед функцией поставить восклицательный знак (или что-либо ещё)?

metalbeaver
() автор топика
Ответ на: комментарий от metalbeaver

Не знаю о какой документации идет речь.

Могу предположить - пример именно такой, потому что ты читаешь документацию по оператору void, а не по какому-то другому оператору.

Помимо прочего, совсем не любой оператор можно поставить без задней мысли в подобные конструкции, потому что некоторые операторы могут быть не только унарными, но и бинарными, и есть правило ASI.

В третьих, использование других операторов произведет куда больше действий - будут вызываться алгоритмы приведения типов, методы Symbol.toPrimitive/valueOf/etc.

void наиболее явный способ обозначить, что ты делаешь. И наиболее безопасен для тех, кому сложно жить с ASI.

Самый популярный довод противников ASI

let x = 10
[1,2,3].map(i => i).forEach(console.log)

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

let x = 10
void [1,2,3].map(i => i).forEach(console.log)

Давая возможность программисту явно указать в конкретном месте, что он ожидает.

javascript
()