ホームページ  >  記事  >  ウェブフロントエンド  >  JavaScript 関数プログラミングの純粋関数を理解する (コード)

JavaScript 関数プログラミングの純粋関数を理解する (コード)

不言
不言転載
2019-03-15 14:35:352439ブラウズ

この記事は、JavaScript 関数プログラミングにおける純粋関数 (コード) の理解をもたらします。一定の参考価値があります。必要な友人は参照できます。お役に立てれば幸いです。

関数型プログラミングにおける純粋関数を理解するには?

概念: 実行コンテキストには依存せず、コンテキストの変数にも影響を与えません。出力は、 input

コードを理解する

// 综上,非纯函数,输入依赖外部变量
let b = 1
function unPure(a) {
    return a + b
}

// 综上,非纯函数,输出改变外部变量
let o = {}
function unPure(object) {
    object.ex = 1
    return object
}

// 综上, 纯函数, 输出输入不影响外部变量
function pure(a) {
    let b = 1
    return a + b
}

純粋関数の利点

概念もコードの理解も非常に簡単であることがわかったと思いますが、なぜ純粋関数を使用するのでしょうか?以下に、純粋関数を使用する利点をリストします。

  • キャッシュ可能性
  • 移植性
  • テスト可能性
キャッシュ可能性のプロパティ

純粋な関数は入力に基づいてキャッシュできます

// 下面的代码我们可以发现相同的输入,再第二次调用的时候都是直接取的缓存
let squareNumber  = memoize((x) => { return x*x; });
squareNumber(4);
//=> 16
squareNumber(4); // 从缓存中读取输入值为 4 的结果
//=> 16
squareNumber(5);
//=> 25
squareNumber(5); // 从缓存中读取输入值为 5 的结果
//=> 25

実装方法は次のコードを見てみましょう

const memoize = (f) => {
  const cache = {};
  return () => {
    var arg_str = JSON.stringify(arguments);
    // 关键就在这里,我们利用纯函数相同输入相同输出的逻辑,在这里利用cache做一个简单的缓存,当这个参数之前使用过时,我们立即返回结果就行
    cache[arg_str] = cache[arg_str] || f.apply(f, arguments);
    return cache[arg_str];
  };
};
移植性

移植性 セックスの言葉では、次のように使用できます。プロジェクト A で使用したことがある場合は、プロジェクト B で使用しても問題ありません。

もう一度コードを理解しましょう

// 我们注意看下方有两个注册的函数

// 不纯的, 如果B项目想要用到这个函数,很显然我们将其依赖的其它服务给搬过去
const signUp = function(attrs) {
  var user = saveUser(attrs);
  welcomeUser(user);
}
// 纯的, 我们再来看看下面这个纯函数写法,纯函数给了我们足够多的信息,我们想在B项目使用其功能只需将单个方法搬过去再给其注入需要的参数即可
const signUp = function(Db, Email, attrs) {
  return function() {
    var user = saveUser(Db, attrs);
    welcomeUser(Email, user);
  };
};
テスト容易性

要約すると、これは非常に簡単です。他の外部情報を気にする必要はありません。必要なのは、関数に特定の入力を与え、その出力をアサートすることだけです

#概要

    出力は外部変数に依存しません
  • 出力は外部変数を変更しません
  • 固定入力固定出力
  • キャッシュ可能、移植可能、テスト可能

以上がJavaScript 関数プログラミングの純粋関数を理解する (コード)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はsegmentfault.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。