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, но ведь он всё же вычисляет выражение...

Ведь void оператор только возвращает undefined, но ведь он всё же вычисляет выражение...

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

ddidwyll ★★★★
()
const fn = void (() => console.log("hi"));

try {
  fn();
} catch (e) {
  console.log('test function is not defined');
  // Expected output: "test function is not defined"
}
ddidwyll ★★★★
()
Последнее исправление: ddidwyll (всего исправлений: 1)
Ответ на: комментарий от ddidwyll

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

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

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

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

Вероятно это не объявление функции а именованная блямба.

ya-betmen ★★★★★
()
Ответ на: комментарий от ddidwyll
void function test() { console.log("hi"); }();

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

???

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

А, неправильно вопрос прочитал. Я не знаю почему так.

ddidwyll ★★★★
()

Потому что 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
()

Чтобы максимально запутать людей, писавших до этого на Цэ

Shadow ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.