void
void 運(yùn)算符 對(duì)給定的表達(dá)式進(jìn)行求值,然后返回 undefined。(MDN)
表達(dá)式前面如果帶有 void
關(guān)鍵字,則表達(dá)式的結(jié)果就會(huì)被忽略,并將 undefined
作為結(jié)果。
從業(yè)務(wù)上來(lái)看,void 關(guān)鍵字并不常用。
1. 用于調(diào)用函數(shù)表達(dá)式
當(dāng)想讓一個(gè)函數(shù)立即實(shí)行的時(shí)候,需要讓 JavaScript 將一個(gè)函數(shù)識(shí)別為表達(dá)式,void 關(guān)鍵字就能起到這個(gè)作用。
void function() {
alert('馬上執(zhí)行!沖沖沖!');
}();
但有局限性,如果需要獲取到函數(shù)的返回值,就不能使用 void。
var num1 = 1;
var num2 = 2;
var result = void function(number1, number2) {
return [number1 + number2, number1 * number2];
}(num1, num2);
result.forEach(function(res) {
console.log(res);
});
如這個(gè)例子,函數(shù)返回了兩數(shù)之和與兩數(shù)之積的結(jié)果,但因?yàn)?void 關(guān)鍵字,實(shí)際 result 變量被賦值為 undefined
,導(dǎo)致程序無(wú)法正常執(zhí)行。
2. 內(nèi)聯(lián)在 HTML 中,阻止 a 標(biāo)簽的默認(rèn)事件
<a>
標(biāo)簽的 href
屬性,可以用來(lái)執(zhí)行 JavaScript
代碼。
通??梢赃@么寫:
<a href="javascript: void;">跳轉(zhuǎn)!</a>
<a href="javascript: void 0;">跳轉(zhuǎn)!</a>
<a href="javascript: void (0);">跳轉(zhuǎn)!</a>
這三行代碼的效果是一樣的。
如果 <a>
標(biāo)簽的 href
屬性是 javascript:表達(dá)式;
,則會(huì)執(zhí)行表達(dá)式的內(nèi)容,并將頁(yè)面的內(nèi)容設(shè)置為表達(dá)式的結(jié)果,如果表達(dá)式的結(jié)果是 undefined,則什么都不做。
根據(jù)這個(gè)規(guī)則,void
就起到了作用,但其實(shí)不寫表達(dá)式,依然能達(dá)到這個(gè)效果。
<a href="javascript:;">跳轉(zhuǎn)!</a>
這樣的效果和上面使用 void
關(guān)鍵字的方式是等價(jià)的,這也是常用的方式。
但碰到需要使用 <a>
標(biāo)簽執(zhí)行函數(shù)的時(shí)候,void 就變得相對(duì)關(guān)鍵。
<script>
function log(who) {
console.log('點(diǎn)擊了:' + who);
return who;
}
</script>
<a href="javascript: log('add');">添加</a>
<a href="javascript: log('update');">修改</a>
<a href="javascript: log('delete');">刪除</a>
這種情況如果不加 void
,頁(yè)面內(nèi)容就會(huì)發(fā)生改變,因?yàn)?log 函數(shù)存在非 undefined 的返回值。
<script>
function log(who) {
console.log('點(diǎn)擊了:' + who);
return who;
}
</script>
<a href="javascript: void log('add');">添加</a>
<a href="javascript: void log('update');">修改</a>
<a href="javascript: void log('delete');">刪除</a>
加上 void 一樣,結(jié)果就符合預(yù)期了,具體的添加、刪除操作,再通過(guò)綁定對(duì)應(yīng)的事件來(lái)實(shí)現(xiàn)。
3. 小結(jié)
void 的使用場(chǎng)景有限,但在某些情況下可以提高代碼的健壯性,如明確不需要結(jié)果的場(chǎng)景下,加上 void 關(guān)鍵字,這樣可以避免未來(lái)表達(dá)式結(jié)果的改變帶來(lái)的問(wèn)題。