2017-04-16 88 views
-1

Wikipedia全球範圍內的前綴或後綴運算符是否有副作用?

在計算機科學中,功能或表達被認爲具有的副作用,如果它修改某些狀態下的範圍內,或具有與其調用函數或外界可觀察到的相互作用。

You Don't Know JS

還有其他副作用的表達,雖然。例如:

var a = 42; 
var b = a++; 

我得到42被分配到B,再變成43。然而,由於A和B都在全球範圍內爲什麼會這被認爲是副作用?

我很感激任何幫助。

+0

維基百科的作者可能不是JavaScript表達式的scope'的'不同的想法 - 因爲這篇文章是語言無關。後來在同一篇文章中,C++中的變量賦值被認爲是副作用。 –

回答

1

在最嚴格的定義,每一個賦值給一個變量是一個副作用,因爲它與維基百科的文章中給出這個例子適合:

例如,特定功能可能[...]修改其參數

之一,所以這也是a++如此:它可能不會在JavaScript的術語功能,但運營商只是什麼一般可以調用的函數不同的語法。

但是,在實用該術語的使用中,當操作是「壞」副作用時,即當該功能也具有另一效果時,被認爲具有副作用,被認爲是主要效應,考慮到它發生的上下文。

例如,假設您有一個修改其參數並返回一個值的函數。例如Array.prototype.push。如果這個函數被調用,它的返回值被忽略,那麼我們就在實踐不是說有一個副作用,儘管嚴格說來有:

a = []; 
a.push('x'); 

在最嚴格的意義上,即使賦值操作符在a = [];將意味着一個副作用(因爲一個被修改),但在通常的語音,我們不會認爲(壞)的副作用。

但是,當您使用返回值a.push('x')時,則有兩個效果起作用:返回的值和的修改。在這種情況下,上下文會作出這樣的返回值主要效果,以及一個副作用突變:

a = []; 
if (a.push('x') == 1) { 
    console.log('you have one element in your array'); 
} 

在這裏,我們肯定有副作用,無論是在該術語的嚴格和通用含義。上下文現在是一個評估表達式,因此push的返回值在這裏起主要作用。a的突變成爲副作用。

在你的例子中發生了同樣的情況。如果發生a++;的聲明,即不使用返回的值,那麼我們就不會普遍稱之爲(壞的)副作用:

a++; 

然而,當還使用返回值,我們不這樣說它有一個副作用:

b = a++; 

此外,這是根據該術語在實用口語中的用語;在嚴格意義上,a++總是代表一個副作用。

上所以一些更多閱讀: