2017-04-16 17 views
-1

Wikipediaから:コンピュータサイエンスのグローバルスコープ内の接頭辞または接尾辞演算子は副作用ですか?

、関数や式は、その範囲外のいくつかの状態を変更するか、その呼び出し機能や、外の世界との観測可能な相互作用を持っている場合は副作用を持っていると言われています。 You Don't Know JS

から

はいえ、他の副作用表現があります。たとえば:?

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

私は42をbに代入され、その後、aとbが、これは副作用と考えられる理由は、グローバルスコープの両方であることから、しかし、43になると取得しますか

ご協力いただきありがとうございます。

最も厳密な定義で
+0

ウィキペディアの執筆者は、JavaScriptをより表現のscope' 'の異なる考えを持っているかもしれません - この記事は、言語に依存しないでと。同じ記事の後半では、C++での変数の代入は副作用と見なされます。 –

答えて

1

それはWikipediaの記事に与えられたこの例で収まるように、変数へのすべての割り当てが副作用である:例えば

、特定の機能のかもしれません[...]それは、JavaScriptの用語では機能ではないかもしれないが、事業者は、一般的には機能と呼ばれることができるもののためだけに別の構文です:これはa++についても同様であるその引数

のいずれかを変更します。

しかし、の実用的なの使用では、「悪い」副作用、すなわちその機能に別の効果がある場合、副作用があると言われています。 メイン効果、それが起こる文脈で与えられる。

たとえば、引数を変更して値を返す関数があるとします。たとえば、Array.prototype.pushです。この関数が呼び出され、その戻り値は無視され、その後、我々は実際で副作用があった言わないだろう、厳密に言えばそこにあるにもかかわらず、場合:

でも代入演算子最も厳密な意味で
a = []; 
a.push('x'); 

a = [];の場合は(が変更されているため)副作用が含まれていますが、一般的な音声では、その副作用は考慮しません。

ただし、戻り値a.push('x')を使用すると、2つのエフェクトが役割を果たします。戻り値は、です。ここでは、確かに両方、副作用を持って

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

:その場合は、コンテキストは、その戻り値にメイン効果、およびの変異副作用になるだろう厳密かつ共通の意味。コンテキストは現在評価式であるため、ここでは戻り値pushが主な役割を果たします。の突然変異が副作用となる。

あなたの例でも同じことが起こります。また、戻り値が使用されている場合

a++; 

しかし、我々は言う:a++;が文として発生した場合は、返された値が使用されていない、つまり、我々は一般的に(悪い)副作用それを呼び出すことはありませんそれは副作用があります:

b = a++; 

また、これは会話の言葉での用語の実際の使用によるものです。厳密にはa++は常に副作用を表します。

SO上のいくつかのより多くの読書:

関連する問題