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