クリーンアップ機能


関数の定義
関数定義フォーマット例関数宣言関数add(x,y){return x+y;}関数式varadd=function(x,y){return x+y;}Functionコンストラクション関数varadd=new function("x"、"y"、"return x+y");矢印関数(ES 6)var add(x,y)=>x+y;
関数宣言文と式
// 자바스크립트엔진은 함수 선언문의 함수 이름으로 식별자를 암묵적 생성하고 생성된 함수 객체를 할당한다.
function sub(x, y) {
    return x - y;
};

console.log(sub(7, 5)); // 2
// 함수는 함수 이름으로 호출하는 것이 아니라 함수 객체를 가리키는 식별자로 호출한다.
var add = function addFun(x, y) {
    return x + y;
};

console.log(add(2,5)); // 7
  • 関数宣言文と関数式の動作は似ているように見えますが、同じではありません.
  • 関数宣言文は「非式文」であり、関数式は「式文」である.
  • 関数の作成ポイントと関数のエスケープ
    console.log(add(5, 6)); // 11
    console.log(sub(6, 5)); // typeError: sub is not a function
    // 함수 선언문
    function add(x, y) {
        return x + y;
    }
    // 함수 표현식
    var sub = function (x, y) {
        return x - y;
    }
    
    /*자바스크립트에서 모든 선언문은 런타임 이전에 자바스크립트 엔진에 의해 먼저 실행된다.
    즉 함수 선언문으로 함수를 정의 하면 런타임 이전에 함수객체가 먼저 생성된다.
    그리고 동일한 이름으로 식별자를 암묵적으로 생성한다.*/
    /*함수 호이스팅은 함수를 호출하기 전에 반드시 함수를 선언해야 한다는 당연한규칙을 무시함으로
    함수 선언문 대신 함수 표현식 사용을 권장한다.*/
    以上のように,関数宣言はコードの先頭に引き上げられ,動作のJavaScript固有の特徴を関数コード記述と呼ぶ.
    関数呼び出し
    // 인수를 적게 넘겨 줄 경우
    // 인수가 부족 할 경우 에러가 발생하지 않고 할당되지 않는 매개변수는 undefined로 할당
    function add(x, y) {
        return x + y;
    }
    console.log(add(2));// NaN
    
    // 인수를 많이 넘겨 줄 경우
    // 매겨변수보다 인수가 더 많은 경우 초과된 인수는 무시된다.
    // But, 인수는 그냥 버려지는 것이 아니라 모든 인수는 암묵적으로 arguments 객체의 프로퍼티로 보관
    function add2(x, y) {
        return x + y;
    }
    consol.log(add2(2, 5, 10)); // 7
    リターンステートメント
    function foo() {
        return;
    }
    console.log(foo()) // undefined
    
    function foo2() {
    
    }
    console.log(foo2()); // undefined
    
    function foo3() {
        return
        x+y;
    }
    consolelog(foo3()); // undefined
    // return문 과 반환값 사이에 줄 바꿈이 존재할 경우 return 옆에 세미콜론이 추가 된다.
    インスタント実行関数
    // 함수 정의와 동시에 즉시 호출 되는 함수로 단 한번만 호출된다. 보통 익명함수로 생성
    (function () {
        var a = 3;
        var b = 5;
        return a * b;
    }());
    関数式vs関数宣言
    関数式と宣言文の違い
    一つ目は文法です.

  • 関数宣言:関数はプライマリ・コード・ストリームの間に独立した構文で存在します.
    // 함수 선언문
    function sum(a, b) {
      return a + b;
    }

  • 関数式:式または構文構造(syntax construct)の内部に関数を作成します.次の例では、代入演算子=を使用して作成された代入式の右側に関数が生成されます.
    // 함수 표현식
    let sum = function(a, b) {
      return a + b;
    };
  • 2つ目の違いは、JavaScriptエンジンが関数を生成するタイミングです.
    関数式は、実際に実行されたストリームが関数に到達したときに関数を生成します.したがって、ストリーム到達関数を実行する場合に使用できます.
    スクリプトを実行します.実行フローがlet sum = function…の右側(関数式)に達すると、関数が生成されます.これ以降、この関数(割り当て、呼び出しなど)を使用できます.
    ただし、関数宣言は少し異なりますが、関数宣言を定義する前に関数宣言を呼び出すことができます.したがって、スクリプトがどこにあるかにかかわらず、グローバル関数宣言はどこでも使用できます.
    これはJavaScriptの内部アルゴリズムのためかもしれません.スクリプトを実行する前に、JavaScriptは準備フェーズでグローバル宣言の関数宣言を検索し、対応する関数を生成します.スクリプトが実際に実行される前に、定義された関数は初期化フェーズの関数宣言で作成されます.スクリプトは、すべての関数宣言を処理した後にのみ実行されます.したがって、スクリプト内の任意の場所で、関数宣言文で宣言された関数にアクセスできます.
    sayHi("John"); // Hello, John
    
    function sayHi(name) {
      alert( `Hello, ${name}` );
    }
    関数宣言は、sayHiがスクリプト実行準備フェーズで生成されるため、スクリプト内の任意の場所からアクセスできます.
    ただし、関数式で定義された関数は、関数が宣言される前にアクセスすることはできません.
    sayHi("John"); // error!
    
    let sayHi = function(name) {  // (*) 마법은 일어나지 않는다.
      alert( `Hello, ${name}` );
    };
    関数式は、ストリーム到達式を実行するときに作成されます.上記の例では、実行フローが(*)で表されるローに到達すると、非常に遅い関数が作成されます.
    3つ目の違いは、スコフです.厳密モードでは、関数宣言がコードブロック内にある場合、ブロック内の任意の場所で関数にアクセスできます.ただし、ブロック外では関数にアクセスできません.
    実行時には、変数ageがその値を知ることができ、この変数の値に基づいて、関数welcome()を異なる定義する必要がある.次に、関数welcome()は、後で使用する必要がある場合であると仮定する.
    関数宣言を使用すると、コードは予想通りに実行されません.
    let age = prompt("나이를 알려주세요.", 18);
    
    // 조건에 따라 함수를 선언함
    if (age < 18) {
    
      function welcome() {
        alert("안녕!");
      }
    
    } else {
    
      function welcome() {
        alert("안녕하세요!");
      }
    
    }
    
    // 함수를 나중에 호출한다.
    welcome(); // Error: welcome is not defined
    関数宣言は、関数宣言のコードブロック内でのみ有効であるため、このエラーが発生します.
    別の例を見てみましょう.
    let age = 16; // 16을 저장했다 가정하자.
    
    if (age < 18) {
      welcome();               // \   (실행)
                               //  |
      function welcome() {     //  |
        alert("안녕!");        //  |  함수 선언문은 함수가 선언된 블록 내
      }                        //  |  어디에서든 유효하다
                               //  |
      welcome();               // /   (실행)
    
    } else {
    
      function welcome() {
        alert("안녕하세요!");
      }
    }
    
    // 여기는 중괄호 밖이기 때문에
    // 중괄호 안에서 선언한 함수 선언문은 호출할 수 없다.
    
    welcome(); // Error: welcome is not defined
    では、ifのドアの外でwelcome関数を呼び出す方法はありますか?
    関数式を使用できます.if文の外に宣言された変数welcomeに関数式で作成された関数を割り当てるだけです.
    コードが予想通りに動作します.
    let age = prompt("나이를 알려주세요.", 18);
    
    let welcome;
    
    if (age < 18) {
    
      welcome = function() {
        alert("안녕!");
      };
    
    } else {
    
      welcome = function() {
        alert("안녕하세요!");
      };
    
    }
    
    welcome(); // 제대로 동작한다.
    3つの演算子?を使用すると、上記のコードをさらに簡略化することができる.
    let age = prompt("나이를 알려주세요.", 18);
    
    let welcome = (age < 18) ?
      function() { alert("안녕!"); } :
      function() { alert("안녕하세요!"); };
    
    welcome(); // 제대로 동작한다.
    関数宣言文と関数式で何を選択しますか?
    彼は、まず関数宣言を利用して関数を宣言することを考えたほうがいいと言った.関数宣言で関数を定義する場合は、関数宣言の前に呼び出すことで、コード構成をより自由にすることができます.
    関数宣言を使用すると、読みやすさも向上します.コード内でlet f = function(…) {…}を検索するのはfunction f(…) {…}を検索するよりも簡単だからです.関数の宣言方法はさらに「目立つ」.ただし、何らかの理由で関数の宣言方法が適切でない場合、または(前例のように)条件に基づいて関数を宣言する必要がある場合は、関数式を使用する必要があります.
    サマリ
  • 関数は値です.したがって、関数は値のように割り当て、コピー、宣言することもできます.
  • 「関数宣言(文)」で関数を生成すると、関数は独立した構文で存在します.
  • 「関数式」で関数が生成されると、関数は式の一部として存在する.
  • 関数宣言は、コードブロックが実行される前に処理される.したがって、ブロック内のどこでも使用できます.
  • 関数式は、ストリーム到達式を実行するときに作成されます.
  • 関数を宣言する必要がある場合は、関数を宣言する前に関数を使用することもできますので、関数の宣言に従うことが望ましいです.関数宣言方式は、コードを柔軟に整理し、読みやすさを向上させることができます.最後に、関数式は、関数宣言文を使用してその場で使用しないことが望ましい.
    きほんパラメータ
    関数式と比較して、単純で簡潔な構文で関数を作成する方法があります.
    矢印関数(arrowfunction)を使用します.矢印関数という名前は文法の顔を借りたという.
    let func = (arg1, arg2, ...argN) => expression
    このようにコードが記述されると、受信パラメータarg1..argNの関数funcが生成される.関数funcは、矢印(=>)の右側にある표현식(expression)を評価し、評価結果を返します.
    以下の関数の略バージョンといえる.
    let func = function(arg1, arg2, ...argN) {
      return expression;
    };
    より具体的な例を見てみましょう.
    let sum = (a, b) => a + b;
    
    /* 위 화살표 함수는 아래 함수의 축약 버전이다.
    
    let sum = function(a, b) {
      return a + b;
    };
    */
    
    alert( sum(1, 2) ); // 3
    ご覧のように、(a, b) => a + bは、係数aおよびbを受け入れる関数です.(a, b) => a + bは、瞬間式a + bの実行を評価し、結果を返す.

  • 因数が1つしかない場合は、因数を囲む括弧を省略できます.カッコを省略すると、コードの長さをさらに短縮できます.
    例:
    let double = n => n * 2;
    // let double = function(n) { return n * 2 }과 거의 동일하다.
    
    alert( double(3) ); // 6

  • 因数が一つもないときは、括弧を空ければいいです.ただし、この場合は括弧は省略できません.
    let sayHi = () => alert("안녕하세요!");
    
    sayHi();
  • 矢印関数は、関数式と同じ方法で使用できます.
    次の例に示すように、関数を動的に作成できます.
    let age = prompt("나이를 알려주세요.", 18);
    
    let welcome = (age < 18) ?
      () => alert('안녕') :
      () => alert("안녕하세요!");
    
    welcome();
    矢印関数に最初に触れると、可読性が低下します.知らないから.しかし、文法が上手になると、慣れるのは簡単になります.
    関数の本文の1行の簡単な関数、矢印の関数でするのは便利です.その利点は、タイプが少なくても関数を生成できることです.
    複数行矢印関数
    上記の矢印関数は、=>の左側の引数を用いて=>の右側の式を計算する関数である.
    ただし、評価が必要な式や複数の構文を持つ関数がある場合があります.この場合、矢印関数構文を使用して関数を作成することもできます.ただし、この場合はカッコ内に評価が必要なコードを入れるべきです.returnインジケータを使用して、次のように結果値を返すことを明示します.
    let sum = (a, b) => {  // 중괄호는 본문 여러 줄로 구성되어 있음을 알려준다.
      let result = a + b;
      return result; // 중괄호를 사용했다면, return 지시자로 결괏값을 반환해주어야 한다.
    };
    
    alert( sum(1, 2) ); // 3
    サマリ
    矢印関数は、本明細書で1行の関数を記述するときに役立ちます.本明細書が1行でない場合は、矢印関数を別の方法で記述する必要があります.
  • カッコなし:(...args) => expression–矢印の右側に式を配置します.関数は式を評価し、評価結果を返します.
  • 中括弧を一緒に記入:(...args) => { body }–本明細書が複数行で構成されている場合は、中括弧を使用します.ただし、この場合、returnインジケータを使用して戻り値を明記する必要があります.
  • 三次関数
    3つの方法で関数を作成できます.

  • 関数宣言:プライマリ・コード・ストリームの使用方法
    function sum(a, b) {
      let result = a + b;
    
      return result;
    }

  • ≪関数式|Function Expression|oraolap≫:式で宣言された関数
    let sum = function(a, b) {
      let result = a + b;
    
      return result;
    };

  • 矢印関数:
    // 화살표(=>) 우측엔 표현식이 있음
    let sum = (a, b) => a + b;
    
    // 대괄호{ ... }를 사용하면 본문에 여러 줄의 코드를 작성할 수 있음. return문이 꼭 있어야 함.
    let sum = (a, b) => {
      // ...
      return a + b;
    }
    
    // 인수가 없는 경우
    let sayHi = () => alert("Hello");
    
    // 인수가 하나인 경우
    let double = n => n * 2;
  • 関数には、領域変数があります.ゾーン変数は、関数本文で宣言された変数であり、関数内部からのみアクセスできます.
  • パラメータのデフォルト値を設定できます.文法は以下の通りです.function sum(a = 1, b = 2) {...}
  • 関数は、常にいくつかのものを返します.returnドアがない場合は、undefinedに戻ります.