[javascript]モダンjavascriptDeepDive-18関数と一級オブジェクト

9100 ワード

一級オブジェクト


次の条件を満たすオブジェクトを1レベルオブジェクトと呼びます.

  • 無名の文字を生成することができます.つまり、実行時に生成できる

  • 変数やデータ構造オブジェクト、配列などに格納できます.

  • 関数のパラメータに渡すことができます.

  • 関数の戻り値として使用できます.
  • JavaScriptの関数は、次の例に示すように、上記のすべての条件を満たすため、1レベルのオブジェクトです.
    関数は1レベルのオブジェクトです.これは、オブジェクトと同じ関数を使用できることを意味します.オブジェクトが値であるため、関数は値と同じ値と見なすことができます.したがって、任意の場所(変数付与文、オブジェクトのproperty値、配列内の要素、関数呼び出しの引数、関数戻り文)で関数をテキストとして定義し、実行時に関数オブジェクトとして計算できます.
    一級オブジェクトとして、関数が持つ最大の特徴は、通常のオブジェクトのように関数に伝達できるパラメータであり、関数の戻り値としても使用できることです.これは関数式プログラミングを可能にするJavaScriptの利点の一つである.

    関数オブジェクトの構成


    関数はオブジェクトです.したがって、関数にもpropertyがあります.


    パラメータ構成


    関数オブジェクトのarguments property値はargumentsオブジェクトです.Argumentsオブジェクトは、関数呼び出し時に伝達されるパラメータ情報を含むループ可能な類似配列オブジェクトであり、関数では領域変数として使用される.
    JavaScriptは、関数のパラメータとパラメータの数が一致しているかどうかをチェックしません.したがって,関数呼び出し時にパラメータ数をパラメータ数で渡さなくてもエラーは発生しない.
    javascriptの特性は、宣言パラメータの個数および関数を呼び出すときに渡されるパラメータの個数を決定しないため、関数を呼び出すときにパラメータの個数をチェックし、それに応じて関数の動作を定義する必要がある場合があります.このとき有用なのはargumentsオブジェクトである.argumentsオブジェクトは、パラメータ個数を決定できない可変パラメータ関数を実装する際に有用である.
    function sum() {
      let res = 0;
      
      for (let i = 0; i < arguments.length; i++) {
        res += arguments[i];
      }
      return res;
    }
    
    console.log(sum());
    console.log(sum(1,2));
    console.log(sum(1,2,3));
    Argumentsオブジェクトには、パラメータ情報が倍余で含まれていますが、実際の配列ではなく、類似の配列オブジェクトです.類似配列オブジェクトとは、長さの輪郭を持つオブジェクトで、ドアを介して巡回できるオブジェクトです.
    似たような配列のオブジェクトは配列ではないので、配列方法を使用するとエラーが発生します.したがって、配列方法を使用するには、Function.prototype.call, Function.prototype.applyを使用して間接的に呼び出す必要がある.後でよく見ます.
    function sum() {
      // arguments 객체를 배열로 변환
      const array = Array.prototype.slice.call(arguments);
      return array.reduce(function (pre, cur) {
        return pre + cur;
      }, 0);
    }
    このような煩わしさを解決するために,ES 6はRESTパラメータを導入した.
    // ES6 Rest parameter
    function sum(...args) {
      return args.reduce((pre, cur) => pre + cur, 0);
    }
    argumentsオブジェクトとrestパラメータについては26章で詳細に学習する.

    長さパーセント


    関数オブジェクトのlength propertyとは、関数を定義するときに宣言されるパラメータの数です.
    function foo() {}
    console.log(foo.length); // 0
    Argumentsオブジェクトのlength propertyはパラメータの個数を表し、関数オブジェクトのlength propertyはパラメータの個数を表す.

    名義財産


    匿名関数式の場合、ES 5のname propertyは空の文字列を値とします.ES 6は、関数オブジェクトを指す識別子を値として使用する.
    var namedFunc = function foo() {};
    console.log(namedFunc.name); // foo
    
    vbar ananymousFunc = function() {};
    // ES5: name 프로퍼티는 빈 문자열
    // ES6: 함수 객체를 가리키는 변수 이름을 값으로 갖는다.
    console.log(anonymousFunc.name);