2016-03-06 12 views

答えて

11

有する不純な機能を独自のスコープ外の変数に対する副作用:

var count = 0; 

function increaseCount(val) { 
    count += val; 
} 

それとも、パラメータとして与えられていない変数を評価するため、同じ入力に対して異なる値を返す関数:

var count = 0; 

function getSomething() { 
    return count > 0; 
} 
+0

私は、この例のように。私はすべてJavaScriptコールのようなAPI(関数を純粋に保つ)ですが、OOPでJavaScriptを使用しています(MyStringClass.length()などの不純な関数を含むこともあります)。 –

+0

純粋な関数の背後にある考え方は、OOPを使用しないことです。状態を保持する「クラス」を構築したい場合は、常に不完全な機能があります。しかし、彼らがすべて同じクラスの一部である限り、これはあなたがOOPのために作らなければならないトレードオフです。 – migg

0

私が考えることができる例は(実際にはかなり混乱しています)Array#reverse()です。新しい配列を返す代わりに、元の配列を返しながらその配列を変更します。

いくつかの他の配列関数は、このようなsplicepushshiftpopunshiftとして、同様にこれを行います。

function (objectArgument) { 
    return { 
     value: objectArgument.value + 123, 
     // other arguments 
    }; 
} 

impure関数(引数を取得し、それを変更し、変更されたオブジェクトを返す):

0

pure関数(引数を取得し、新しい値を返す)。例えば

function (objectArgument) { 
    objectArgument.value += 123; 
    return objectArgument; 
} 
0
  1. 不純functonは、 同じ入力パラメータに異なる結果を返す関数です。つまり、それはある州に依存するということです。
  2. 同じ入力パラメータで同じ結果が返される可能性があるが、のは他の状態オブジェクトを変更する関数です。それは依存しませんが、他の人が//行うことをオブジェクトが原因の副作用

は、例:

1)

var toggled = false; /* state */ 

    /*impure function*/ 
    function impureFn(number){ 
    if(number%2 == 0) 
     toggled = true; 
    return toggled; 
    } 

    /*Execute this in order */ 
    impureFn(5) // returns false 
    impureFn(2) //returns true 
    impureFn(5) // now returns true 
2

Math.random()不純な機能です。 Mathオブジェクトの内部状態が変更されるため、連続する呼び出しで異なる値が取得されます。 console.log()alert()は、副作用があるため(これらは同じ動作を生成し、常に同じ呼び出しに対して同じ値を返します)、不正な関数です。

引数のいずれかの内部状態または外部変数の値を変更する関数は、いずれも不正な関数です。

ここで、不純な機能は常に悪いとみなされているという考え方はありますか?

+0

'console.log()'がどのように不正な機能ですか?いくつかアイデアをお願いしますか? – Sourav

+0

@Sourav - 私は 'console.log()'を呼び出すたびに副作用(具体的にはコンソールに書き込む出力)がある理由について説明しました。出力を生成する関数呼び出しは、定義上、不正な関数です。 (たとえば、[Wikipedia article _Pure function_](https://en.wikipedia.org/wiki/Pure_function)を参照してください)。 –

4

純粋な関数は、その範囲外の変数の状態に依存せず、変更しません。

具体的には、純粋な関数は、常に同じパラメータを指定して同じ結果を返すことを意味します。その実行はシステムの状態に依存しません。

var values = { a: 1 }; 

function impureFunction (items) { 
    var b = 1; 

    items.a = items.a * b + 2; 

    return items.a; 
} 

var c = impureFunction(values); 
// Now `values.a` is 3, the impure function modifies it. 

ここでは、指定されたオブジェクトの属性を変更します。したがって、関数の範囲外にあるオブジェクトを修正します。関数は不純です。

var values = { a: 1 }; 

function pureFunction (a) { 
    var b = 1; 

    a = a * b + 2; 

    return a; 
} 

var c = pureFunction(values.a); 

単に機能の範囲内にあるパラメータを変更するだけで、外部は変更されません。

var values = { a: 1 }; 
var b = 1; 

function impureFunction (a) { 
    a = a * b + 2; 

    return a; 
} 

var c = impureFunction(values.a); 
// Actually, the value of `c` will depend on the value of `b`. 
// In a bigger codebase, you may forget about that, which may 
// surprise you because the result can vary implicitly. 

ここで、bは機能の範囲内ではない。結果はコンテキストに依存します:驚きが期待されます!

var values = { a: 1 }; 
var b = 1; 

function pureFunction (a, c) { 
    a = a * c + 2; 

    return a; 
} 

var c = pureFunction(values.a, b); 
// Here it's made clear that the value of `c` will depend on 
// the value of `b`. 

参考:これは、現在、私の最大の落とし穴であるようFor more details, click here

関連する問題