モダンJavaScript Day 14&15&16


🔖 読み取り範囲:12章関数


ブックマーク


関数Function


  • 関数は文(statement)によって一連のプロセスを実現し、コードブロックで囲まれ、実行ユニットとして定義される.


  • 関数の構成:
  • 関数の内部に入力を渡すパラメータ
  • 入力引数
  • 出力を戻り値と呼びます.
  • 関数は、識別子としての関数名を使用して特定の関数を区別できる値です.

  • JavaScript関数の特徴:
  • 関数はオブジェクトです.値の性質を持つ一級オブジェクトでもあります.🌟
  • 関数がオブジェクトのようにメモリを格納する場合、格納関数オブジェクトのメモリアドレスは識別子に格納される(参照値によって渡される).
  • の一般オブジェクトは呼び出せませんが、関数を呼び出すことができます.さらに、通常のオブジェクトではない関数オブジェクトに限定される一意のpropertyがあります.
  • javascriptエンジンは、生成された関数を呼び出し、関数名と同じ名前の識別子を暗黙的に生成し、関数オブジェクトを割り当てます.
  • 関数定義機能定義


  • 関数を定義する方法は4つあります.
  • 関数宣言の機能宣言
  • 関数式機能展開
  • Functionジェネレータ関数Function Conductor Function
  • 矢印関数(es 6)Arrow Function
  • //함수 선언문
    function add(x,y) {
    	return x+y;
    }
    
    //함수 표현식 
    var add = function (x,y) {
    	return x+y;
    };
    
    //Function 생성자 함수
    var add = new Function ('x','y','return x+y');
    
    //화살표 함수
    var add = (x,y) => x+y;
    

  • ちなみに、関数は「定義」(definition)として表されます.変数は「宣言」を表し、逆も同様である.関数は、関数宣言が評価された後、識別子がデフォルトで生成され、関数オブジェクトが割り当てられるため、宣言後に割り当てられます.

  • 関数宣言vs.関数式

  • 1)関数宣言は、関数名を省略することはできません.
    逆に、関数式は、関数を値として変数に割り当てます.したがって、関数名を省略することができます.なぜなら、関数式では、関数名ではなく変数名を使用して識別子を選択するからです.
    このように変数名の代わりになるので、関数名は省略します.このように変数名のみであり,関数名が省略された関数を「匿名関数」と呼び,省略されていないものを「記名関数」と呼ぶ.
    //함수 표현식 (익명)
    var add = function (x,y) {
    	return x+y;
    };
    
    //함수 표현식 (기명)
    var add = function add (x,y) {
    	return x+y;
    };

  • 2)関数宣言文は式ではなく文です.つまり、値切れない.
    関数式は式文であるため、値として使用できます.

  • 3)また、関数宣言として定義された関数は、関数宣言の前に呼び出すことができる.すなわち,関数反発が発生する.(*すべての宣言は、実行時までに実行されます.)
    しかし、関数式で関数を定義すると、関数反発ではなく変数反発が発生します.すなわち、変数宣言は実行時より前に行われますが、変数値の割り当ては実行時に評価されるため、関数式の前に呼び出された値は未定義と評価され、関数を呼び出すとタイプエラーが発生します.

  • ファンクションジェネレータ関数
  • は、まず、関数宣言文または関数式で生成された関数と同じではないことを知るだけです.

  • 矢印関数
  • 関数キーワードの代わりに矢印=>を使用して、関数をより簡単に宣言できます.矢印関数は常に匿名関数として定義されます.
  • 関数呼び出しFunction Call/Invoke


  • 関数呼び出しは、識別子と関数呼び出し演算子を呼び出すためにカッコ()のペアを使用します.
    // 함수 선언
    function add (x,y) {
    	return x+y;
    }
    
    //함수 호출
    var result = add(1,2); 

  • 関数を実行するために必要な値を外部から関数内部に渡す必要がある場合は、パラメータをパラメータで渡します.引数は、値から計算できる式でなければなりません.パラメータは、関数を呼び出すときに指定され、数とタイプは制限されません.

  • 関数は、パラメータと引数の個数が一致するかどうかをチェックしません.パラメータが欠落しているためパラメータが割り当てられていないパラメータの値は定義されていません.パラメータがより多い場合、スキップされたパラメータは無視されます.このように無視されたパラメータは破棄されるのではなく,Arguオブジェクトとしてのpropertyが暗黙的に保存され,後で可変パラメータ関数を実現する際に使用される.(第18章)

  • また、JavaScriptはダイナミックタイプ言語です.脱文字JavaScript関数では、パラメータのタイプを事前に指定することはできません.したがって、javascriptでは、関数を定義する際に適切なパラメータが渡されていることを確認する必要があります.p.171のようなコードを直接作成したり、javascriptの親拡張バージョンのタイプスクリプトを導入したりして、コンパイル時に適切に呼び出されないようにします.

  • 推奨パラメータは最大3つまでです.

  • 関数はreturnキーと式(戻り値)を使用して、関数の実行結果を外部に返すことができます.

  • 文を返す2つのロール:1.関数の実行を中断し、関数体を終了します.2.キーワードの後の式を返します.指定されていない場合はundefinedを返します.
    function foo () {
    	return;
    }
    console.log(foo()); // undefined
  • 参照による外部ステータスの転送と変更

  • 11章「元の値とオブジェクトの比較」に示すように、元の値は値として渡され、オブジェクトは参照として渡されます.パラメータは関数体内部でも変数と同じとみなされるため、パラメータもタイプ別に値別に伝達し、参照別に伝達する方式に従う.
  • 元のタイプのパラメータの値自体がコピーされてパラメータに渡されるため、関数ボディで値を変更しても元のタイプは破損しません.言い換えれば、付随的な効果は発生しません.
  • オブジェクトタイプパラメータの参照値がコピーされてパラメータに渡されるため、関数ボディで参照値によってオブジェクトが変更されると破損します.言い換えれば、付随効果が生じる.
  • これらのオブジェクトの変更を追跡するには、ファイバモード*でオブジェクト参照を共有しているすべての人にさらなる応答と通知が必要です.オブジェクトを不変オブジェクトとして作成する(16章で説明する)ことによっても使用できます.
  • このように外部状態を変化させず、外部状態にも依存しない関数を純関数と呼ぶ.純粋な関数により賦値効果を最大限に抑制し,誤りを回避し,プログラムの安全性を高めるプログラミングモードを関数型プログラミングと呼ぶ.(外部状態または外部状態から変更された関数を非純関数と呼びます.)
  • 各種関数の形式


  • 大体4種類に分けることができます:即時実行関数、再帰関数、重畳関数、コールバック関数

  • インスタント実行関数:関数を定義しながらすぐに呼び出される関数.
    (function () {}() );	혹은 
    (function (){})();		혹은 
    !function (){}();		혹은  
    +function(){}();		로 표현한다.
     ```
    

  • 再帰関数:独自の関数を呼び出します.通常は複文の代わりに使われる.再呼び出しを止める脱出ドアを作らなければならない.そうでない場合、再帰関数が無限に呼び出され、スタックオーバーフローエラーが発生します.
    var factorial = function foo (n) {
    
    	//탈출 조건 n 이 1 일 때 재귀호출을 멈춘다.
     if (n <= 1) return 1;
     
     // otherwise, 재귀 호출
     return n * factorial(n-1);
    };

  • ネストされた関数(または内部関数):関数内の関数.逆に、これらのオーバーラップ関数を含む関数を「外部関数」と呼びます.オーバーラップ関数は主に外部関数のhelper関数を助ける役割を果たす.

  • コールバック関数🌟: 関数のパラメータを介して他の関数の内部に渡されます.逆に、パラメータを介して関数の外部からコールバック関数を渡す関数を「高次関数」と呼びます.高次関数は、コールバック関数の呼び出し時間を決定することによって呼び出され、コールバック関数を関数に渡す場合、コールバック関数を呼び出す必要はなく、関数自体を渡す必要があります.
    // 외부함수 repeat. 외부에서 전달받은 함수f(콜백함수)를 n만큼 반복호출한다.
    function repeat (n,f) {
    	for (var i=0; i < n; i++) {
     	f(i);
     }
    };
    
    // 소환될 함수(콜백함수)1
    var logAll = function (i) {
    	console.log(i);
    };
    
    // 소환될 함수(콜백함수)2
    var logOdd = function (i) {
    	if (i % 2) console.log(i);
    };
    
    // 반복 호출할 함수를 인수로 전달한다.
    
    repeat ( 5, logAll);				// !주의: logAll() 아님. logAll 임. 
    repeat ( 5, logOdd);				// 여기도 마찬가지. 콜백함수는 호출 x, 함수 자체 전달.
    
    
  • 疑問点

  • 匿名関数
  • ファイバモード
  • の一般オブジェクトは呼び出せませんが、関数を呼び出すことができます.さらに、通常のオブジェクトではない関数オブジェクトに限定される一意のpropertyがあります.
  • ††感じたこと

  • 関数...膨大な量ですね.
  • コールバック関数を間違えました.私はそれが後に実行される関数であることしか知らない.それは別の高次関数によって呼び出されたタイミングで呼び出された関数である.
  • 💖 サマリ

  • 関数の全体的なフレームワークを作成した.