[javascript]モダンjavascriptDeepDive-18関数と一級オブジェクト
9100 ワード
一級オブジェクト
次の条件を満たすオブジェクトを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);
Reference
この問題について([javascript]モダンjavascriptDeepDive-18関数と一級オブジェクト), 我々は、より多くの情報をここで見つけました https://velog.io/@injoon2019/자바스크립트모던-자바스크립트-Deep-Dive-18.-함수와-일급-객체テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol