JS関数式プログラミング--純関数(バグリコ予防)

2282 ワード

数学では、関数の概念は、入力xに対して出力y=f(x)を生成することである.
純関数の定義:同じ入力に対しては永遠に同じ出力が得られ、観察可能な副作用もなく、外部環境にも依存しない状態である.(純関数とは、そのスコープ外の変数に依存せず、変更しない関数のことです.)
eg 1:反例
var num = 18;
function compare(x){
  return x > num;
}
console.log(compare(20));  //true
この関数は純粋な関数ではない.戻り値は外部作用領域のnumに依存するからである.
eg 2:eg 1を修正する
function compare(x, num){
  return x > num;
}
console.log(compare(20, 18));  //true
この関数は、外部に依存しないというパラメータにのみ関連しています.また、関数の実行が完了すると、外部に影響がありません(外部変数の値を変更していません).
eg 3:続きを見る
var num = 18;
function compare(x, num){
  //    ,    compare      num,      
  //num = 19;   //    1(     ,     eg4     )
  return x > num;
}
console.log(compare(20, num));  //true
//  :         num,       
eg 4:eg 3と比べると、外変数が変わるクリ:
var arr = [];
function add(_arr){
  var obj = {name: 'djl'};
  _arr.push(obj);
}
add(arr);
console.log(arr);  //[{name: 'djl'}],     arr     。
//  :     。

//【  】  eg3  num    ,arr    ,arr        ,        arr; eg3 ,      1   num  ,         num.
eg 5:外部変数が変わらないようにeg 4を改善します.
var arr = [];
function add(_arr){
  var obj = {name: 'djl'},
      newArr = [];  //      ,       
  newArr.push(obj);
  return newArr;
}
var newArr = add(arr);
eg 6:さらに深くする.配列には参照対象があります.
var arr = [{name: 'ppy'}];
function add(_arr){
  var obj = {name: 'djl'},
      newArr = [];  //      ,       
  //            
  for(var i = 0; i < _arr.length; i++){
    newArr[i] = deepClone(_arr[i]);  //                     ,          。
  }
  newArr.push(obj);
  return newArr;
}
var newArr = add(arr);
newArr[0].name = 'haha';  //     deepClone  ,      arr  ,           。
newArr.push({name: 'hello'});
bug-保存の法則:
ウェブサイトまたはアプリケーションのコード量が一定のレベルに達すると、彼はある種のバグを含むことは避けられないだろう.これはJS特有の問題ではなく、ほとんどの言語の共通病です.不可能ではないですが、プログラムのすべてのバグを徹底的にクリアするのは難しいです.しかし、これはいくつかのコード方式でバグの導入を防ぐことができないという意味ではありません.
純粋な関数の役割:
JSではグローバル変数を作成しやすいかもしれません.これらの変数は通常、すべての関数にアクセスできます.これはまた、バグの一般的な原因の一つであり、プログラムのどの部分も大域変数を修正し、関数挙動に異常が生じる可能性があるからである.
純粋な関数は、コンテキスト環境を考慮する必要がないので、入力と出力だけを考慮する必要があります.
純関数はロバストであり、実行順序を変えることはシステムに影響を与えない.純関数の動作は並列に実行できるからである.
用途:配列フィルタ、コンポーネント化開発.より良い管理状態で、予測性に達する.(後期ブログ紹介、更新し続けます)