純粋な関数がたくさんあり、副作用のない方法は、不確実な関数の例です。常に不安定で大きなエラーの原因となります?JavaScriptの不純な関数の例とは何ですか?
答えて
有する不純な機能を独自のスコープ外の変数に対する副作用:
var count = 0;
function increaseCount(val) {
count += val;
}
それとも、パラメータとして与えられていない変数を評価するため、同じ入力に対して異なる値を返す関数:
var count = 0;
function getSomething() {
return count > 0;
}
私が考えることができる例は(実際にはかなり混乱しています)Array#reverse()
です。新しい配列を返す代わりに、元の配列を返しながらその配列を変更します。
いくつかの他の配列関数は、このようなsplice
、push
、shift
、pop
、unshift
として、同様にこれを行います。
function (objectArgument) {
return {
value: objectArgument.value + 123,
// other arguments
};
}
impure
関数(引数を取得し、それを変更し、変更されたオブジェクトを返す):
pure
関数(引数を取得し、新しい値を返す)。例えば
function (objectArgument) {
objectArgument.value += 123;
return objectArgument;
}
- 不純functonは、 同じ入力パラメータに異なる結果を返す関数です。つまり、それはある州に依存するということです。
- 同じ入力パラメータで同じ結果が返される可能性があるが、のは他の状態オブジェクトを変更する関数です。それは依存しませんが、他の人が//行うことをオブジェクトが原因の副作用
は、例:
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
Math.random()
不純な機能です。 Math
オブジェクトの内部状態が変更されるため、連続する呼び出しで異なる値が取得されます。 console.log()
とalert()
は、副作用があるため(これらは同じ動作を生成し、常に同じ呼び出しに対して同じ値を返します)、不正な関数です。
引数のいずれかの内部状態または外部変数の値を変更する関数は、いずれも不正な関数です。
ここで、不純な機能は常に悪いとみなされているという考え方はありますか?
'console.log()'がどのように不正な機能ですか?いくつかアイデアをお願いしますか? – Sourav
@Sourav - 私は 'console.log()'を呼び出すたびに副作用(具体的にはコンソールに書き込む出力)がある理由について説明しました。出力を生成する関数呼び出しは、定義上、不正な関数です。 (たとえば、[Wikipedia article _Pure function_](https://en.wikipedia.org/wiki/Pure_function)を参照してください)。 –
純粋な関数は、その範囲外の変数の状態に依存せず、変更しません。
具体的には、純粋な関数は、常に同じパラメータを指定して同じ結果を返すことを意味します。その実行はシステムの状態に依存しません。
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
- 1. 純粋なものと不純なものとの違いは何ですか?
- 2. 純粋な関数が純粋な意味を返すのは何ですか?
- 3. javascriptのvar関数と関数の違いは何ですか?
- 4. この単純なJavascript関数に何か問題がありますか?
- 5. プロトタイプ関数とjavascriptの通常の関数との違いは何ですか?
- 6. 純粋なブラウザ内JavaScriptテストフレームワークとは何ですか?
- 7. 純粋なJavaScriptチュートリアルとリファレンスは何ですか?
- 8. インラインアセンブリでより高速に実装される単純なC関数の例は何ですか?
- 9. Common Lispの "functorの不正な引数"とは何ですか?
- 10. 純粋な関数内のIOアクションの意味は何ですか?
- 11. この単純なjavascriptは何ですか?
- 12. このjavascript関数の変数結果は何ですか
- 13. 例外処理パーソナリティ関数とは何ですか?
- 14. javascript関数内で「これを返す」とは何ですか?
- 15. これはjavascriptのコールバック関数の例ですか?
- 16. 最も高速で純粋なJavascript、Graphビジュアライゼーションツールキットは何ですか?
- 17. 関数の__proto__とは何ですか?
- 18. javascriptで不要なグローバル変数を検出する方法は何ですか
- 19. なぜjavascriptで引数として関数を渡すのですか?ポイントは何ですか?
- 20. このAES JavaScript関数のIVは何ですか?
- 21. この関数はFacebookのJavaScriptソースで何をしますか?
- 22. '$()'の中にjavascript関数を置くのは何ですか?
- 23. 単純なjavascript関数の定義の問題
- 24. 引数をとらない関数とは何ですか?
- 25. jsfiddleとfirebugで確認した単純なjavascript onclick関数の呼び出し -
- 26. 単純なsqliteの例ですか?
- 27. コールバック関数と正規関数の違いは何ですか?
- 28. __cudaRegisterFatBinary関数と__cudaRegisterFunction関数のパラメータは何ですか?
- 29. スレッドエントリ関数と通常関数の違いは何ですか?
- 30. 関数と*関数の違いは何ですか?
私は、この例のように。私はすべてJavaScriptコールのようなAPI(関数を純粋に保つ)ですが、OOPでJavaScriptを使用しています(MyStringClass.length()などの不純な関数を含むこともあります)。 –
純粋な関数の背後にある考え方は、OOPを使用しないことです。状態を保持する「クラス」を構築したい場合は、常に不完全な機能があります。しかし、彼らがすべて同じクラスの一部である限り、これはあなたがOOPのために作らなければならないトレードオフです。 – migg