[TIL]JS-一級オブジェクトとしての関数



Today I Learned


第1クラスオブジェクト

  • JavaScriptでは、関数がオブジェクトとして扱われるため、次の特性があります.
  • テキスト
  • を作成できます.
  • 変数は
  • を割り当てることができる.
  • 関数としてのパラメータ伝達
  • 関数の戻り値
  • を返すことができる.
  • 動的作成/割り当てProperty
  • の一級オブジェクトとしての関数は何ですか?
    オブジェクト
  • は、パラメータ伝達、変数代入等とすることができる
  • 宣言プログラミングとコマンドプログラミング

  • 宣言プログラミングは、何(What)、コマンドプログラミング(How)に注目するプログラミングモデルである.
  • 命令式プログラミング:アルゴリズムO,ターゲットX
  • 宣言プログラミング:アルゴリズムX、ターゲットO
  • 命令型は、特定の問題の解決に重点を置いているため、再利用性が低い.
  • 宣言型抽象コードを使用して再利用性を向上させる.宣言プログラミングは、抽象レベルをコマンドプログラミングよりも高くします.
  • 命令式プログラミングはプログラム的プログラミング、オブジェクト向けプログラミングがある.
  • 宣言式プログラミングには関数式プログラミングがあります.
  • javascriptは、プログラム/オブジェクト/関数プログラミングをサポートします.
  • // Q. 다음 배열에서 5보다 큰 수만 담은 새로운 배열을 만들어라
    const nums = [3, 5, 8, 1, 12, 7, 4, 9];
    
    // Imperative Solution ----------
    const numsBiggerThan5 = (arr) => {
      // Step 1. 리턴할 빈 배열 생성 
      const result = [];
      // Step 2. arr의 각 요소들을 for loop으로 조회
      for (let el of arr) {
        // Step 3. 5보다 큰 경우 result 배열에 push
        if (el > 5) {
          result.push(el);
        }
      }
      // Step 4. 새로 생성된 배열을 리턴
      return result;
    }
    
    // Declarative Solution ----------
    const numsBiggerThan5 = (arr) => {
      // filter 함수의 로직을 몰라도 filter가 무엇을 하는 함수인지만 알면 됨
      return arr.filter(el => el > 5);
    }

    抽象化

  • 複雑な材料、モジュール、およびシステムから重要な概念または機能
  • を抽象化する.
  • ある関数を使用する場合、その関数の内部の論理を知らなくても使用できます.たとえばjavascript内蔵メソッドfilter()を使用すると、そのメソッドの論理はわかりませんが、パラメータを正しく伝達すれば、必要な値を得ることができます.これは抽象的な例で,論理(アルゴリズム)は知らないが,何をするか(目標)を明確にすれば問題を解決できる.
  • 抽象は複雑な論理を回避し、生産性を高めることができる.
  • 高次関数は抽象化レベルを思考(関数)レベルに向上させる.
  • 高次関数/高次関数

  • は、パラメータまたは戻り関数として別の関数を受信する
  • である.
  • JavaScriptの内蔵関数では,関数をパラメータとするfilter(),map(),reduce()などの関数が高次関数の例である.
  • function isEven(num) {
      return num % 2 === 0;
    }
    
    function getEvenNums(arr) {
      return arr.filter(isEven);
    }
    // filter는 함수 isEven을 인자로 받고 있으므로 고차함수
    // isEven은 filter의 전달인자로 사용되고 있으므로 콜백함수

    コールバック関数

  • 高次関数に渡されるパラメータ呼び出しの関数
  • は明確なコールはなく、登録のみであり、イベント発生などの特定の時点でコールする.(典型的なイベント処理関数)
  • // 타겟 요소
    const scrollTopBtn = document.querySelector('#scroll-top-btn');
    
    // 이벤트 리스너의 콜백함수로 사용할 scrollTop 함수
    function scrollTop() {
      window.scrollTo({ top: 0, behavior: 'smooth' });
    }
    
    // 이벤트 리스너 생성 + 콜백함수 등록
    scrollTopBtn.addEventListener('click', scrollTop);
    // 타겟 요소에 클릭 이벤트가 발생하면 그때 콜백함수가 호출(실행)됨

    トリム関数

  • 関数型プログラミングの関数を用いて,n個のパラメータを受け入れる関数を1個のパラメータを受け入れるn個の関数に変換する.
  • func(a, b, c) -> func(a)(b)(c)
  • 変化の部分と不変の部分を分けて不変の部分を固定し、変化の部分の関数抽象法を開く.
  • すべてのパラメータが受信されるまで関数の生成を続けます.
  • 関数係数数を1つに減らし,回収性を向上させた.
  • 関数の実行を必要な時点に遅らせることができ、非同期管理が容易になります.
  • const curry = (func) => {
    	return function curriedFunc(...args) {
    		if (args.length >= func.length) {
    			return func(...args);
    		} else {
    			return (...args2) => curriedFunc(...args, ...args2);
    		}
    	};
    };

    関数の組合せ

  • 関数の組み合わせは、2つ以上の関数を1つにまとめる
  • である.
  • カードリングと関数の組み合わせは相互に関連しており、一緒に使用すると協同作用が発生します.
  • const compose = (...funcs) => (initialValue) => funcs.reduceRight((value, func) => func(value), initialValue);