2011-11-30 31 views
4

The void operator in JavaScript將調用內部GetValue(expr),但始終返回undefined,無論使用什麼值或表達式。爲什麼void操作符在總是計算爲undefined時調用GetValue(expr)?

細則中指出:

11.4.2操作

生產UnaryExpression空隙:無效UnaryExpression評估如下:

  1. 讓EXPR是這個結果評估UnaryExpression
  2. 致電GetValue(expr)
  3. 返回未定義。

GetValue必須被調用,即使它的值沒有被使用,因爲它可能有可觀察的副作用。

我的問題是,爲什麼?什麼樣的可觀察的副作用可能發生?我們能否證明無效可能會改變程序流程,並討論如果我們不運行GetValue會發生什麼?

+1

無這裏的答案似乎解釋'呼叫的GetValue(表達式).',其中'expr'是** **結果* UnaryExpression *。這是你似乎在問的第2步。是對的嗎。 – RightSaidFred

+1

@RightSaidFred正確。爲什麼要回報我們永遠不會使用的東西爲什麼使用void返回undefined?如果我們有其他方法返回undefined? (問題的兩個部分) – Incognito

回答

5

如果你正在編寫一個沒有副作用的程序,那麼一個總是返回undefined的函數是沒有用的,因爲它不會將有用的信息返回給調用者。在這種情況下,如果你總是知道你會回來什麼,你可能根本不會調用這個函數。

但是,如果語言有「副作用」,即使返回undefined的函數仍然可以在編程上有用。 「副作用」是某種效果的技術術語,它不是函數返回值的一部分。作爲一個具體的例子,DOM的變異是一個副作用,它不會計算並返回一個有用的值,但是您仍然希望DOM樹的狀態發生變異。播放聲音也是一個副作用。因爲,語法,它迫使表達式上下文,從而使之類的東西的函數表達式的值可以明確地表達

作爲邊注,空隙可以是有用的。例如

void function(){alert('hi')}() 
2

我看到這個用例,如幾次:

javascript:void window.open("http://foo.com") 

這可以bookmarklets用來避免地址欄上改變值,但仍執行的代碼 - 所以你會顯然想要評估該功能,而不是忽略它。

它有時也被偏執的程序員使用,他們不相信undefined沒有被覆蓋的地方。如果您確實需要知道undefined,則可以將其與void 0進行比較(因爲void是保留關鍵字,因此不能用作函數名稱)。

+0

Nit:'void'是一個*運算符* - 禁止使用保留字作爲字面標識符。 – 2011-11-30 19:59:06

+0

我已經看到它在bookmarklets中使用了很多,難道我們不能簡單地通過不通過閉包或其他方式返回任何東西來避免使用它嗎? – Incognito

+0

@Nit - 好點!更新了我的答案。 –

相關問題