【十二】関数定義と呼び出し

4094 ワード

定義関数
JavaScriptでは、関数を定義する方法は以下の通りです.
function abs(x) {
    if (x >= 0 ) {
        return x;
    } else {
        return -x;
    }
}
上記のabs()関数の定義は以下の通りです.
  • functionは、関数定義であることを指摘する.
  • absは関数の名前です.
  • (x)括弧内に関数のパラメータを列記し、複数のパラメータを分割して
  • を分割する.
  • {}間のコードは関数体であり、いくつかの語句を含んでいても良いし、語句がなくてもいいです.
  • 関数の内部のステートメントは実行時にリセットされると関数が実行され、結果が返ってきますので、注意してください.したがって,関数内部は条件判断とループにより非常に複雑な論理を実現できる.return文がないと、関数は実行後も結果を返します.結果はundefinedです.JavaScriptの関数もオブジェクトであるため、上記で定義されたabs関数は実際に関数オブジェクトであり、関数名absは関数を指す変数と見なすことができる.したがって、2番目の定義関数の方式は以下の通りである.
    var abs = function (x) {
        if (x >= 0) {
            return x;
        } else {
            return -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)関数のパラメータxはundefinedを受け取り、計算結果はNaNとなります.undefinedを受信しないようにパラメータをチェックできます.
    function abs(x) {
        if (typeof x !== 'number'){
            throw 'Not a number';
        }
        if (x >= 0) {
            return x;
        } else {
            return -x;
        }
    }
    
    アーグメンント
    JavaScriptには無料で提供されるキーワードのargmentsがあります.関数の内部でのみ機能し、現在の関数の使用者から入るすべてのパラメータを永遠に指します.argmentsはArayに似ていますが、Arayではありません.
    function foo (x) {
        alert(x);  // 10
        for (var i=0; i
    argmentsを利用して、あなたは调节者の入ってくるすべてのパラメータを得ることができます.つまり、関数がパラメータを定義しなくても、パラメータの値が得られます.
    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
    
    実際には、argmentsは、着信パラメータの個数を判断するのに最も一般的である.このような書き方が見られます.
    // foo(a[, b], c)
    //   2~3   ,b     ,    2   ,b   null;
    funciton foo(a, b, c) {
        if(arguments.length === 2) {
            //        a b,c undefined
            c = b;  // b  c
            b = null;  //b     
        }
       //  ...
    }
    
    中間のパラメータbを「オプションパラメータ」に変更するには、argmentsでのみ判断し、パラメータを再調整して値を付けることができます.
    パラメータ
    JavaScript関数は任意のパラメータを受信できるので、argmentsですべてのパラメータを取得しなければなりません.
    function foo(a, b) {
        var i, rest = [];
        if (arguments.length > 2) {
            for (i = 2; i
    定義されたパラメータa、b以外のパラメータを取得するためには、argmentsを使用しなければならず、ループはインデックス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パラメータは最後までしか書けません.前は…でマークします.運転結果から、入ってきたパラメータはa、bをバインドして、余分なパラメータは配列形式で変数restに渡します.だから、argmentsを必要としないで、全部のパラメータを取得しました.着信パラメータが正常に定義されているパラメータさえ満たされていない場合は、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' };  //             
    }
    
    正しい複数行の書き方は:
    funciton foo() {
        return {  //          ,  {        
            name: 'foo'
        }
    }