12関数


で行ないます。


一連の入出力を定義するプロセス
定義関数(関数定義)による関数の作成
  • パラメータ(パラメータ):入力変数
  • を関数に渡す
    パラメータ
  • :入力
  • 戻り値(戻り値):出力
  • 関数の呼び出し


    関数を呼び出すと、コードブロックの文はバッチ実行->戻り値を返します.
    // 함수의 호출
    const result = add(2, 5);
    console.log(result); // 7

    関数を使用する理由

  • コードの繰り返し使用:関数
  • を複数回呼び出すことができます.
    メンテナンスが容易な
  • :
  • 関数を開発し、コードの重複を低減し、再利用性を向上
  • コードの信頼性:エラーを減らす
  • コードの可読性:関数名は識別子を付加することによって自身のアクティビティをよりよく記述し、可読性
  • を向上させる.

    関数


    関数ライブラリはfunctionキーワード、関数名、パラメータリスト、および関数ボディから構成されます.
    関数はオブジェクトですが、通常のオブジェクトとは異なります.
    通常のオブジェクトは呼び出せませんが、関数は呼び出せます.

  • 関数名
  • 関数名は識別子であるため、識別子命名規則
  • に従う.
  • 関数名(名前付き関数:名前付き、名前なし/匿名関数:名前なし)
  • を省略できます.

  • パラメータリスト
  • 0以上のパラメータをカッコで囲み、カンマで
  • を区切ります.
  • 各パラメータが関数を呼び出すときに指定する引数は順番に割り当てられ、順序は意味がある
  • である.
  • パラメータも識別子命名規則
  • に適合する.

  • かんすうたい
  • 関数が呼び出されると、1つの実行ユニットによって定義コードブロック
  • が呼び出される.

    関数の定義


    1.関数宣言

  • 関数宣言関数名
  • は省略できません.
  • 関数は、関数名によって呼び出されるのではなく、関数オブジェクトを指す識別子によって呼び出される
  • である.
  • 関数は、「非式文」
  • として宣言されます.
    function add(x, y) {
      return x + y;
    }
    
    // 함수 참조
    console.log(add); // f add(x, y)
    // 함수 호출
    console.log(add(2,5)); // 7
    
    // 함수 선언문은 함수 이름을 생략할 수 없음
    // 함수 선언문은 표현식이 아님
    function (x, y) {
      return x + y; // SyntaxError
    }

    2.関数式

  • 関数は1レベルのオブジェクトであるため、関数ライブラリによって作成された関数オブジェクト
  • を変数に割り当てることができる.
  • 関数式は「式文」
  • です.
    // 기명 함수 표현식
    const add = function foo(x, y) {
      return x + y;
    }
    console.log(add(2,5)); // 7
    
    // 함수 이름으로 호출하면 ReferenceError 발생
    console.log(foo(2,5)); // ReferenceError : foo is not defined
    

    3.関数の作成点と関数のエスケープ

    //함수 참조
    console.dir(add); // f add(x, y)
    console.dir(sub); // undefined
    
    // 함수호출
    console.log(add(2, 5)); // 7
    console.log(sub(2, 5)); // TypeError : sub is not a function
    
    // 함수 선언문
    function add(x, y) {
      return x + y;
    }
    
    // 함수 표현식
    const sub = function (x, y) {
      return x - y; 
    }
  • 関数式として定義された関数は、関数式の前に呼び出すことはできません.
    -関数宣言によって定義された関数と関数式によって定義された関数を作成する時間は、
  • と異なる.
  • 関数式で関数を定義すると、関数反発は発生せず、変数反発
  • が発生する.
    関数エスケープ(function hilling):JavaScriptの固有の特徴は、関数宣言の動作がコードの前にあるようにすることです.

    4.Functionコンストラクタ

  • コンストラクション関数とは、オブジェクトを作成する関数です.
  • 新しい演算子呼び出し
  • を必要とせず、結果は同じ
  • である.
    const add1 = (function () {
      var a = 10;
      return function (x, y) {
        return x + y + a;
      };
    }());
    
    console.log(add1(1, 2)); // 13
    
    // Function 생성자 함수로 생성한 함수는 클로저를 생성하지 않는 등, 
    // 함수 선언문이나 함수 표현식으로 생성한 함수와 다르게 동작
    const add2 = (function () {
      var a = 10;
      return new Function('x', 'y', 'return x + y + a;');
    }());
    
    console.log(add2(1, 2)); // ReferenceError : a is not defined
    

    5.矢印関数

  • ES 6に導入する矢印関数(矢印関数)は、関数キーワードではなく矢印を使用して、関数
  • をより簡単に宣言することができる.
  • 矢印関数は、コンストラクション関数
  • として使用できません.
  • は、既存の関数のバインド方式とは異なり、プロトタイププログラム
  • はない
  • パラメータオブジェクトを作成しない
  • const add = (x, y) => x + y;
    console.log(add(2, 5)); // 7

    関数呼び出し

  • 関数は、関数の識別子と括弧のペアを指す関数呼び出し演算子であり、
  • を呼び出す.

    1.パラメータとパラメータ

  • 関数を実行するために必要な値を関数外部から関数内部に渡す必要がある場合は、パラメータ(パラメータパラメータ)を介してパラメータ(パラメータ)を渡す
  • 数量とタイプは
  • に限らない.
  • パラメータのスキャン(有効範囲)は関数内部で
  • である.
  • JavaScript関数は、パラメータとパラメータの数が
  • に一致するかどうかをチェックしません.
  • JavaScriptは動的タイプ言語であり、パラメータタイプ
  • を予め指定することはできない.
    function add(x, y) {
      	return x + y;
    }
    
    //매개변수보다 인수가 더 많은 경우 초과된 인수 무시
    console.log(add(2, 5, 10)); // 7
    
    // 인수가 전달되지 않는 경우 단축 평가를 사용하여 기본값 할당
    function add(a, b, c) {
      a = a || 0;
      b = b || 0;
      c = c || 0;
      return a + b + c;
    }
    
    console.log(add(1, 2, 3)); // 6
    console.log(add(1, 2)); // 3
    console.log(add()); // 0

    2.パラメータの最大数

  • ECMAScript仕様未明確制限パラメータの最大数
  • パラメータ順序有意義->パラメータが多ければ多いほどメンテナンス性が悪くなる
  • パラメータは、最大3つの
  • を超えないことを推奨します.
  • 理想的な関数は1つのことをするだけで、
  • をできるだけ少なく作成する必要があります.

    3.戻り文

  • 関数は、戻りキーと式(戻り値)からなる戻り文外部戻り(戻り)
  • を使用することができる.
    // ex1) 
    function multiply(x, y) {
      return x * y; // 반환문
      // 반환문 이후에 다른 문이 존재하면 그 문은 실행되지 않고 무시
      console.log('실행되지 않음');
    }
    
    const result = multiply(3, 5);
    console.log(result); // 15
    
    // ex2)
    function foo () {
    	return;
    }
    console.log(foo()); // undefined
    
    // ex3)
    function multiply2(x, y) {
      // return 키워드와 반환값 사이에 줄바꿈이 있으면
      return // 세미콜론 자동 삽입 기능(ASI)에 의해 세미콜론 추가
      x * y; // 무시
    }
    
    console.log(multiply2(3,5)); // undefined
    

    参照による外部ステータスの転送と変更

    // 매개변수 primitive는 원시 값을 전달받고, 매개변수 obj는 객체를 전달받음
    function changeVal(primitvie, obj) {
    	primitive += 100;
     	obj.name = 'Kim';
    }
    
    // 외부
    var num = 100;
    var person = { name: 'Lee' };
    
    console.log(num); // 100
    console.log(person); // { name: "Lee" }
    
    // 원시 값은 값 자체가 복사되어 전달, 객체는 참조 값이 복사되어 전달
    changeVal(num, person);
    
    // 원시 값은 원본이 훼손되지 않음
    console.log(num); // 100
    
    // 객체는 원본이 훼손
    console.log(person); // { name: "Kim" }
    
  • 元の値は可変値(im-matablevalue)であるため、直接変更することはできないため、再割り当てにより割り当てられた元の値を新しい元の値
  • に置き換える.
    転送
  • オブジェクトタイプパラメータobjの場合、オブジェクトは変更可能な値(可変値)であるため、直接割り当てられたオブジェクトを直接変更することができ、再割り当てを必要とせずに
  • を変更することができる.

    たじゅうかんすう


    1.即時実行関数

  • 関数を定義しながら関数を呼び出す
    ->即時実行関数は1回のみ呼び出され、
  • を呼び出すことはできません.
  • インスタント実行関数は、通常匿名関数(関数名なし)を使用します.
    (function () {
      var a = 3;
      var b = 5;
      return a * b;
    }());
    
    // 즉시 실행 함수는 반드시 그룹 연산자(...) 감싸야 함 
    function foo() {
    }(); // SyntaxError
    // 함수 코드 블록의 닫는 중괄호 뒤에 ";"이 암묵적으로 추가되어 오류 발생
    // => function foo() {};();
    
    // 즉시 실행 함수도 일반 함수처럼 값을 반환 가능
    var res = (function () {
      var a = 3;
      var b = 5;
      return a * b;
    }());
    
    console.log(res); // 15
    
    // 즉시 실행 함수에도 일반 함수처럼 인수를 전달할 수 있음
    res = (function (a, b) {
      return a * b;
    }(3, 5));
    
    console.log(res); //15

    さいきかんすう

  • 関数呼び出し自己(再帰呼び出しを実行する関数)
  • の脱出条件を作らなければならない.
    ->条件がない場合は、関数が無限に呼び出され、スタックオーバーフロー障害
  • が発生します.
    function countdown(n) {
      for (var i = n; i >= 0; i--) console.log(i);
    }
    
    countdown(10);
    
    // 재귀 함수로 변경
    function countdown(n) {
      if (n < 0) return;
      console.log(n);
      countdown(n - 1); // 재귀 호출
    }
    countdown(10);

    重ね合わせ関数

  • 関数で定義される関数は、ネスト関数(ネスト関数)であってもよいし、内蔵関数(内部関数)であってもよい.
  • のネスト関数を含む関数は、外部関数(外部関数)
  • である.
  • ES 6から、関数定義は、文が存在する任意の場所の
  • とすることができる.
  • セグメントでは、エスケープ混乱が発生する可能性があるため、if文やfor文などのコードブロックで関数宣言文で関数を定義することは推奨されません.
  • function outer() {
      var x = 1;
      
      // 중첩함수 
      function inner() {
      	var y = 2;
        // 외부 함수의 변수 참조 가능
        console.log(x + y); // 3
      }
      inner();
    }
    
    outer();

    コールバック関数

  • コールバック関数(callback function):関数のパラメータによって他の関数内部に伝達される関数
  • 高次関数:パラメータによって関数の外部からコールバック関数を伝達する関数
  • 高次関数は、パラメータによってコールバック関数の呼び出し時間を決定し、それによって呼び出し
  • を決定する.
  • コールバック関数を他の場所から呼び出す必要がある場合や、コールバック関数を渡す関数を頻繁に呼び出す必要がある場合は、関数の外部でコールバック関数を定義し、関数の参照を高次関数に渡すことで、効率を向上させることができる
  • .
    // ex1)
    // 익명 함수 리터럴을 콜백 함수로 고차 함수에 전달
    // 익명 함수 리터럴은 repeat 함수를 호출할 때마다 평가되어 함수 객체를 생성
    repeat(5 , function (i) {
      if (i % 2) console.log(i);
    }); // 1 3
    
    
    // ex2)
    const logOdds = function (i) {
      if (i % 2) console.log(i);
    };
    
    // 고차 함수에 함수 참조를 전달
    repeat(5, logOdds); // 1 3
    // 콜백 함수를 사용하는 고차 함수 map
    var res = [1,2,3].map(item => item * 2);
    console.log(res); // [2, 4, 6]
    // 콜백 함수를 사용하는 고차 함수 filter
    res = [1,2,3].filter(item => item % 2);
    console.log(res); // [1, 3]
    // 콜백 함수를 사용하는 고차 함수 reduce
    res = [1, 2, 3].reduce((acc, cur) => acc + cur),0);
    console.log(res); // 6

    純関数と非純関数


    純関数(prue function):効果を付与していない関数
    var count = 0;
    // 순수 함수는 동일한 인수가 전달되면 언제나 동일한 값을 반환
    function increase(n) {
      return ++n;
    }
    count = increase(count);
    console.log(count); // 1;
    count = increase(count);
    console.log(count); // 2;
    非純関数(不純関数):付与効果のある関数
    var count = 0;
    function increase() {
      return ++count; // 외부 상태에 의존하여 외부 상태를 변경
    }
    increase();
    console.log(count); // 1;
    increase();
    console.log(count); // 2;
    📖 参考図書:モダンJavaScript Deep Dive JavaScriptの基本概念と動作原理