Я видел, как некоторые люди использовали оператор void
в своем коде. Я также видел это в атрибутах href
: javascript:void(0)
, который не кажется лучше, чем javascript:;
Итак, что оправдывает использование оператора void
?
Я видел, как некоторые люди использовали оператор void
в своем коде. Я также видел это в атрибутах href
: javascript:void(0)
, который не кажется лучше, чем javascript:;
Итак, что оправдывает использование оператора void
?
JavaScript, оператор void
, используется для явного возврата undefined. Это унарный оператор, означающий, что с ним может использоваться только один операнд. Вы можете использовать его, как показано ниже - отдельно или с круглыми скобками.
void expression;
void(expression);
Давайте посмотрим несколько примеров
void 0; //returns undefined
void(1); //returns undefined
void 'hello'; //undefined
void {}; //undefined
void []; //undefined
void myFunction();
void(myFunction());
Если вы спросите, зачем вам специальное ключевое слово, чтобы просто возвращать undefined вместо того, чтобы просто возвращать undefined
: причина в том, что до ES5 вы могли фактически назвать глобальную переменную undefined
, например: var undefined = "hello"
или var undefined = 23
, и большинство браузеров примет это; идентификатор undefined
не обещал быть фактически неопределенным unde. Таким образом, чтобы вернуть фактическое неопределенное значение, был использован оператор void
. Это не очень популярный оператор, и он редко используется.
Давайте посмотрим на пример функции с void,
//just a normal function
function test() {
console.log('hello');
return 2;
}
//lets call it
console.log(test()); //output is hello followed by 2
//now lets try with void
console.log(void test()); //output is hello followed by undefined
void
отбрасывает возвращаемое значение из функции и явно возвращает undefined.
Вы можете прочитать больше из моего учебного поста: https://josephkhan.me/the-javascript-void-operator/
EC В ECMAScript 5 и более поздних версиях глобальная переменная undefined
гарантированно не определена (ECMA-262, 5-е издание., § 15.1.1.3), хотя все еще возможно иметь переменную внутри внутреннего область действия будет названа undefined
.
Объяснение его использования в ссылках:
Это причина того, что букмарклеты часто оборачивать код внутри void() или анонимная функция, которая не вернуть что-нибудь, чтобы остановить браузер от попытки отобразить результат выполнение букмарклета. За Пример:
javascript:void(window.open("dom_spy.html"))
Если вы напрямую используете код, который возвращает что-то (новый экземпляр окна в этот случай), браузер в конечном итоге отображая это:
javascript:window.open("dom_spy.html");
В Firefox выше будет отображаться:
[object Window]
Значение undefined
не было напрямую доступно в JavaScript до ES1.3.
Таким образом, был включен оператор void <expression>
, чтобы разрешить доступ к этому значению.
Иногда бывает полезно, особенно при работе с веб-API (например, обработчиками событий), чтобы гарантировать, что результат выражения будет последовательно undefined
.
Когда свойство undefined
было добавлено к глобальному объекту в ES1.3, утилита void
стала неочевидной.
Следовательно, ваш вопрос.
Рассмотрим следующее:
<a href="javascript:void(fish=document.getElementById('foo').value);void(document.getElementById('bar').value=fish);">With Void</a>
<a href="javascript:fish=document.getElementById('foo').value;document.getElementById('bar').value=fish;">Without Void</a>
<input type="text" id="foo" value="one fish" />
<input type="text" id="bar" value="no fish" />
Первая ссылка изменит значения текстовых полей. Вторая ссылка откроет новую страницу с текстом "одна рыба". Если вы используете javascript: link
, то в минуту выражение возвращает что-то, отличное от null
или undefined
, браузер интерпретирует это как то, что должна делать ссылка. Упаковывая все выражения/статусы в функцию void()
, вы гарантируете, что весь фрагмент кода будет запущен. В наши дни это в основном используется в закладках, так как используется атрибут onclick
или настройка обработчиков событий в отдельных блоках/файлах Javascript является "нормой".
Что касается javascript:
vs. javascript:void()
, первое утверждение неоднозначно. Вы говорите: "Эй, я хочу запустить javascript", но тогда вы не предоставляете никакого кода. Это не обязательно ясно, что браузер должен делать здесь. Со вторым утверждением вы говорите "эй, запустите javascript", и ваш код в конечном итоге возвращает undefined, который, как известно браузеру, означает "ничего не делать".
Так как я здесь, я также укажу, что использование javascript:
или javascript:void();
не понравилось большинству людей, которые заботятся о разметке. Лучше всего сделать, чтобы обработчик onclick возвращал false, и указала ссылку на страницу/ресурс, которая имеет смысл для людей, у которых отключен JavaScript, или использует блокировщик javascript, такой как NoScript.