2017-11-12 20 views
0

それは次のように純粋な関数であることhereを述べた:私は最初の関数は、それ以来、純粋であるかを理解していない以下はどのように純粋な関数ですか?

function insert(user) { 
    if (DB.exists(user.id)) { 
     throw Error("users exists"); 
    } 
    var id = DB.insert(user); 
    user.id = id; 
    return user; 
} 

function insert(DB, user) { 
    return function() { 
     throwIfUserExists(DB, user); 
     var savedUser = saveUser(DB, user); 
     return savedUser; 
    } 
} 

と、次は不純な関数であります副作用を引き起こす関数を返します。私は間違っていますか?そうでなければ、関数はどのように純粋であると書かれますか?

+1

私は最初の関数を呼び出すとします。副作用は実際に起こりますか? – user2357112

+2

最初の関数では、関数を返すだけで、実行していません。したがって、副作用はありません。 –

+0

'副作用を引き起こす機能' - どのような副作用ですか? –

答えて

1

純粋関数は関数です:

  • は、同じ入力を考えると、常に同じ出力を返します。
  • 副作用はありません。

最初の点に注意してください。 最初の例では、同じDBuserで送信し続ける限り、出力は同じになります。 savedUserまたはthrowIfUserExists関数の構成は、最初のinsert fnの出力に影響しますが、挿入関数は本質的に純粋な関数になります。

しかし、2番目の機能では、userが同じであっても、各コールで出力が異なります。正確には、user.id = id;という行が「副作用」を引き起こしています。純粋な機能の

読むエリック・エリオットの記事:https://medium.com/javascript-scene/master-the-javascript-interview-what-is-a-pure-function-d1c076bec976

関連する問題