技術共有

上級 JavaScript プログラミング (第 4 版) -- 学習記録機能 (前編)

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

関数

各関数は Function 型のインスタンスであり、他の参照型と同様に、Function にもプロパティとメソッドがあります。関数はオブジェクトであり、関数名は関数オブジェクトへのポインタであり、必ずしも関数自体に厳密にバインドされているわけではありません。

関数定義の関数宣言定義

  1. function sum (n1,n2){
  2. return n1+n2;
  3. }

関数定義の関数式

  1. let sum = function(n1,n2){
  2. return n1+n2;
  3. };

関数定義 アロー関数

  1. let sum = (n1,n2)=>{
  2. return n1+n2;
  3. };

関数定義コンストラクター

  1. let sum = new Function("n1","n2","return n1+n2");
  2. /*这个构造函数接收任意多个字符串参数,
  3. 最后一个参数始终会被当成函数体,
  4. 而之前的参数都是新函数的参数*/

アロー関数

アロー関数は、関数式を使用できる場所ならどこでも使用できます。

  1. let sum = (a,b)=>{
  2. return a+b;
  3. };
  4. let sum1 = function(a,b){
  5. return a+b;
  6. };
  7. //箭头函数适合嵌入函数的场景
  8. let arr = [1,2,3];
  9. console.log(arr.map(function(i) {return i+1;}));
  10. console.log(arr.map((i)=>{return i+1;}));
  11. //二者结果一样,但是箭头函数更为简洁
  12. //如果只有一个参数,括号可以不用。只有没有参数,或者多个参数的情况下,才使用括号
  13. let double = (x)=>{return 2*x;};
  14. let triple = x => {return 3*x};
  15. //箭头函数也可以不使用大括号,但这样会改变函数的行为。使用大括号就说明包含函数体,可以在一
  16. //个函数中包含多条语句,跟常规函数一样。如果不使用,后面只能有一行代码。
  17. let double = (x)=>{return 2*x;};
  18. let triple = x=>3*x;

アロー関数の構文は単純ですが、適さない状況も多くあります。アロー関数は引数、super、new.target を使用できず、コンストラクターとしても使用できません。さらに、アロー関数にはプロトタイプ属性がありません。

アロー関数のパラメータ

関数はアロー構文を使用して定義されているため、関数に渡されるパラメーターには、arguments キーワードを使用してアクセスすることはできません。定義された名前付きパラメーターを介してのみアクセスできます。

  1. function foo() {
  2. console.log(arguments[0]);
  3. }
  4. foo(5); // 5
  5. let bar = () => {
  6. console.log(arguments[0]);
  7. };
  8. bar(5); // ReferenceError: arguments is not defined

関数名

関数には複数の名前を付けることができます。

  1. function sum(num1, num2) {
  2. return num1 + num2;
  3. }
  4. console.log(sum(10, 10)); // 20
  5. let anotherSum = sum;
  6. console.log(anotherSum(10, 10)); // 20
  7. sum = null;
  8. console.log(anotherSum(10, 10)); // 20

デフォルトのパラメータ値

関数定義のパラメータの後に = を使用することで、パラメータにデフォルト値を割り当てることができます。

  1. function makeKing(name = 'Henry') {
  2. return `King ${name} VIII`;
  3. }
  4. console.log(makeKing('Louis')); // 'King Louis VIII'
  5. console.log(makeKing()); // 'King Henry VIII'

デフォルトのパラメータ値はプリミティブ値やオブジェクト型に限定されず、呼び出し関数によって返される値も使用できます

  1. let romanNumerals = ['I', 'II', 'III', 'IV', 'V', 'VI'];
  2. let ordinality = 0;
  3. function getNumerals() {
  4. // 每次调用后递增
  5. return romanNumerals[ordinality++];
  6. }
  7. function makeKing(name = 'Henry', numerals = getNumerals()) {
  8. return `King ${name} ${numerals}`;
  9. }
  10. console.log(makeKing()); // 'King Henry I'
  11. console.log(makeKing('Louis', 'XVI')); // 'King Louis XVI'
  12. console.log(makeKing()); // 'King Henry II'
  13. console.log(makeKing()); // 'King Henry III'

パラメータの展開と収集

ES6 では、コレクション データを非常に簡潔に操作および結合するために使用できる新しい拡張演算子が追加されています。スプレッド演算子にとって最も役立つシナリオは、関数定義内のパラメーター リストであり、言語の弱い型指定と可変長パラメーターを最大限に活用できます。スプレッド演算子は、関数呼び出し時にパラメーターを渡したり、関数パラメーターを定義したりするために使用できます。

拡張パラメータ

  1. let values = [1, 2, 3, 4];
  2. function getSum() {
  3. let sum = 0;
  4. for (let i = 0; i < arguments.length; ++i) {
  5. sum += arguments[i];
  6. }
  7. return sum;
  8. }
  9. //不使用扩展操作符实现累加
  10. console.log(getSum.apply(null,values));
  11. //使用扩展操作符
  12. console.log(getSum(...values));

パラメータを収集する

収集されたパラメータの前に名前付きパラメータがある場合は、残りのパラメータのみが収集されます。そうでない場合は、空の配列が取得されます。パラメータの収集結果は可変であるため、最後のパラメータとしてのみ使用できます。

  1. function getProduct(...values,lastValue){}//不可以
  2. function ignoreFirst(firstValue,...values){console.log(values)}//可以
  3. ignoreFirst(); // []
  4. ignoreFirst(1); // []
  5. ignoreFirst(1,2); // [2]
  6. ignoreFirst(1,2,3); // [2, 3]

関数宣言と関数式

コードが実行される前に、JavaScript エンジンは関数宣言を読み取り、実行コンテキストで関数定義を生成します。関数式は、実行コンテキストで関数定義が生成される前に、コードがその行まで実行されるまで待機する必要があります。
  1. // 没问题
  2. console.log(sum(10, 10));
  3. function sum(num1, num2) {
  4. return num1 + num2;
  5. }
  6. /*函数声明提升*/
  7. // 会出错
  8. console.log(sum(10, 10));
  9. let sum = function(num1, num2) {
  10. return num1 + num2;
  11. };