JSの関数

5454 ワード

関数の定義と呼び出し
前に、JSデータのタイプとオペレータの学習を通して、私達は正式に関数の学習を始めることができました.
ほとんどの内容は廖雪峰先生のJS教材で転載しています.
定義関数
JavaScriptでは、関数を定義する方法は以下の通りです.
function abs(x) {
    if (x >= 0) {
        return x;
    } else {
        return -x;
    }
}
上記abs()の関数の定義は以下の通りである.
  • functionは、これが関数定義であることを指摘する.
  • absは関数の名前です.
  • (x)カッコ内に関数のパラメータがリストされ、複数のパラメータが,で分離される.
  • { ... }の間のコードは関数体であり、いくつかの語句を含んでいてもよく、ステートメントがなくても良い.
  • 関数内部のステートメントは実行時にreturnに実行されると、関数は実行済みで、結果を返します.したがって,関数内部は条件判断とループにより非常に複雑な論理を実現できる.return文がない場合は、関数は実行後に結果を返します.結果はundefinedです.
    JavaScriptの関数もオブジェクトであるため、上記で定義されたabs()関数は実際には関数オブジェクトであり、関数名absは関数を指す変数と見なすことができる.
    したがって、2番目の定義関数の方式は以下の通りである.
    var abs = function (x) {
        if (x >= 0) {
            return x;
        } else {
            return -x;
        }
    };
    
    このように、function (x) { ... }は、関数名がない匿名関数である.しかし、この匿名関数の値は変数absに与えられているので、変数absを介して関数を呼び出すことができる.
    上記の2つの定義は完全に等価であり、第2の方法は完全な文法に従って関数の最後に;を追加する必要があり、割当文の最後を示す.
    関数を呼び出す
    関数を呼び出すときは、順番にパラメータを入力すればいいです.
    abs(10); //   10
    abs(-9); //   9
    
    JavaScriptは、呼び出しに影響を及ぼさずに任意のパラメータに入ることができるので、入力されたパラメータは定義されたパラメータよりも多くても大丈夫です.関数の内部にはこれらのパラメータが必要ではありません.
    abs(10, 'blablabla'); //   10
    abs(-9, 'haha', 'hehe', null); //   9
    
    着信パラメータは定義より少なくても大丈夫です.
    abs(); //   NaN
    
    このとき、abs(x)関数のパラメータxundefinedを受信し、計算結果はNaNである.undefinedを受信しないようにパラメータをチェックしても良いです.
    function abs(x) {
        if (typeof x !== 'number') {
            throw 'Not a number';
        }
        if (x >= 0) {
            return x;
        } else {
            return -x;
        }
    }
    
    アーグメンント
    JavaScriptは、関数の内部でのみ機能し、現在の関数の使用者によってもたらされるすべてのパラメータを永遠に指す無料のキーワードargumentsもある.argumentsArrayと似ていますが、Arrayではありません.argumentsを利用して、调节者が入ってくるすべてのパラメータを得ることができます.つまり、関数がパラメータを定義しなくても、パラメータの値が得られます.
    function abs() {
        if (arguments.length === 0) {
            return 0;
        }
        var x = arguments[0];
        return x >= 0 ? x : -x;
    }
    
    abs(); // 0
    abs(10); // 10
    abs(-9); // 9
    
    実際にはargumentsは、着信パラメータの数を判断するのに最も一般的である.このような書き方が見られます.
    // foo(a[, b], c)
    //   2~3   ,b     ,    2   ,b   null:
    function foo(a, b, c) {
        if (arguments.length === 2) {
            //         a b,c undefined
            c = b; //  b  c
            b = null; // b     
        }
        // ...
    }
    
    中間パラメータbを「オプション」パラメータに変更するには、argumentsで判断され、パラメータを再調整し、値を付与するしかない.
    パラメータ
    JavaScript関数は任意のパラメータを受信できるので、argumentsを使ってすべてのパラメータを取得しなければならない.
    function foo(a, b) {
        var i, rest = [];
        if (arguments.length > 2) {
            for (i = 2; i
    定義されたパラメータab以外のパラメータを取得するためには、argumentsを使用しなければならず、ループはインデックス2から開始して、前の2つのパラメータを除外する必要があります.このような書き方は違和感があります.ただ、追加のrestパラメータを得るために、より良い方法がありますか?
    ES 6標準は、restパラメータを導入しています.上記の関数は、次のように書き換えられます.
    function foo(a, b, ...rest) {
        console.log('a = ' + a);
        console.log('b = ' + b);
        console.log(rest);
    }
    
    foo(1, 2, 3, 4, 5);
    //   :
    // a = 1
    // b = 2
    // Array [ 3, 4, 5 ]
    
    foo(1);
    //   :
    // a = 1
    // b = undefined
    // Array []
    
    restパラメータは最後にしか書けません.前は...で識別されています.運転結果から、着信パラメータはabにバインディングされています.余分なパラメータは配列形式で変数restに渡しています.したがって、argumentsを必要とせずに、すべてのパラメータを取得しました.
    着信パラメータが正常に定義されているパラメータさえ満たされていないなら、大丈夫です.restパラメータは空の配列を受信します.
    ES 6の新しいパラメータですので、ブラウザがサポートされているかどうかテストしてください.
    あなたのreturn文に注意してください.
    前に述べたJavaScriptエンジンは行末に自動的にセミコロンを追加するメカニズムがあります.これはreturn文の大きな穴に植えられます.
    function foo() {
        return { name: 'foo' };
    }
    
    foo(); // { name: 'foo' }
    
    return文を2行に分解したら:
    function foo() {
        return
            { name: 'foo' };
    }
    
    foo(); // undefined
    
    注意したいのですが、JavaScriptエンジンは行末に自動的にセミコロンを追加する仕組みなので、上のコードは実際になっています.
    function foo() {
        return; //        ,   return undefined;
            { name: 'foo' }; //             
    }
    
    正しい複数行の書き方は:
    function foo() {
        return { //          ,  {        
            name: 'foo'
        };
    }
    
    匿名関数
    匿名関数とは、名前のない関数のことで、実際に開発されたものの使用頻度が非常に高いことを意味します.undefinedには実際の名前の関数がありません.
    まず、一般関数を宣言します.
    //        ,      fn
    function fn(){
      console.log("hello");
    }
    
    //                
    //    , ,   ,       !
    function (){
      console.log("hello");
    }
    
    ここで、匿名関数を単独で実行します.文法の要求に合わないので、エラーが発生しました.解決方法は、匿名関数に括弧を包むだけでいいです.
    //                 
    
    (function (){
      //           ,               。
      console.log("hello");
    })
    
    匿名関数を実行する必要がある場合は、匿名関数の後に括弧を追加して直ちに実行します.
    (function (){
      //     hello
      console.log("hello");
    })()
    
    値を送る必要がある場合は、直接に括弧内にパラメータを記入すればいいです.
    (function (str){
          //     hello world!
          console.log("hello "+str);
    })("world")
    //            
    
    refer:
    廖雪峰のJS教程