Оператор void
Базовый уровень Широко доступно
Эта функция хорошо зарекомендовала себя и работает на многих устройствах и версиях браузеров. Она доступна во всех браузерах с июля 2015 года.
Оператор void вычисляет заданное expression, а затем возвращает undefined.
Попробуйте
const output = void 1;
console.log(output);
// Expected output: undefined
void console.log("expression evaluated");
// Expected output: "expression evaluated"
void (function iife() {
console.log("iife is executed");
})();
// Expected output: "iife is executed"
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 expression
Описание
Этот оператор позволяет вычислять выражения, которые производят значение, в местах, где требуется выражение, которое вычисляется в undefined.
Оператор void часто используется просто для получения примитивного значения undefined, обычно с использованием void(0) (что эквивалентно void 0). В этих случаях может использоваться глобальная переменная undefined.
Следует отметить, что необходимо учитывать приоритет оператора void и то, что скобки могут помочь прояснить вычисление выражения, следующего за оператором void:
void 2 === "2"; // (void 2) === '2', returns false void (2 === "2"); // void (2 === '2'), returns undefined
Примеры
Немедленно вызываемые функциональные выражения
При использовании немедленно вызываемого функционального выражения ключевое слово function не может стоять в самом начале оператора, поскольку это будет интерпретировано как объявление функции и вызовет синтаксическую ошибку, когда будут достигнуты скобки, обозначающие вызов — если функция безымянная, это немедленно приведет к синтаксической ошибке, если функция интерпретируется как объявление.
function iife() {
console.log("Executed!");
}(); // SyntaxError: Unexpected token ')'
function () {
console.log("Executed!");
}(); // SyntaxError: Function statements require a function name
Для того чтобы функция была интерпретирована как выражение, ключевое слово function должно стоять в позиции, которая принимает только выражения, а не операторы. Это может быть достигнуто путем добавления префикса из унарного оператора, который принимает в качестве операндов только выражения. Вызов функции имеет более высокий приоритет, чем унарные операторы, поэтому он будет выполнен первым. Его возвращаемое значение (которое почти всегда undefined) будет передано унарному оператору, а затем немедленно отброшено.
Из всех унарных операторов void предлагает лучшую семантику, потому что он четко сигнализирует о том, что возвращаемое значение вызова функции должно быть отброшено.
void function () {
console.log("Executed!");
}();
// Logs "Executed!"
Это немного длиннее, чем обернуть функциональное выражение в скобки, что дает тот же эффект принудительного синтаксического анализа ключевого слова function как начала выражения, а не оператора.
(function () {
console.log("Executed!");
})();
Обратите внимание, что этот трюк применим только к IIFE, определенным с помощью ключевого слова function. Попытка использовать оператор void, чтобы избежать скобок для стрелочной функции, приводит к синтаксической ошибке. Выражения стрелочных функций всегда требуют скобок вокруг них при вызове.
void () => { console.log("iife!"); }(); // SyntaxError: Malformed arrow function parameter list
URI JavaScript
Когда браузер переходит по javascript: URI, он вычисляет код в URI, а затем заменяет содержимое страницы возвращаемым значением, если только возвращаемое значение не является undefined. Оператор void может использоваться для возврата undefined. Например:
<a href="javascript:void(0);">Click here to do nothing</a> <a href="javascript:void(document.body.style.backgroundColor='green');"> Click here for green background </a>
Примечание: Псевдопротокол javascript: не рекомендуется использовать вместо других альтернатив, таких как ненавязчивые обработчики событий.
Стрелочные функции, не допускающие утечек
Стрелочные функции вводят краткую синтаксическую форму без скобок, которая возвращает выражение. Это может вызвать непредвиденные побочные эффекты, если выражение представляет собой вызов функции, возвращаемое значение которой меняется с undefined на какое-либо другое значение.
Например, если doSomething() возвращает false в приведенном ниже коде, флажок больше не будет помечен как выбранный или невыбранный при нажатии на него (возврат false из обработчика отключает действие по умолчанию).
checkbox.onclick = () => doSomething();
Такое поведение вряд ли желательно! Для безопасности, когда возвращаемое значение функции не предполагается использовать, оно может быть передано оператору void, чтобы гарантировать, что (например) изменение API не приведет к изменению поведения стрелочных функций.
checkbox.onclick = () => void doSomething();
Спецификации
Совместимость с браузерами
| Десктоп | Мобильные | Сервер | |||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome Android | Firefox for Android | Opera Android | Safari on iOS | Samsung Internet | WebView Android | WebView on iOS | Bun | Deno | Node.js | |
void |
1 |
12 |
1 |
4 |
3.1 |
18 |
4 |
10.1 |
3 |
1.0 |
4.4 |
3 |
1.0.0 |
1.0 |
0.10.0 |
См. также
© 2005–2025 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/void