JavaScript学習ノート--Function

6007 ワード

JSの関数、継承、閉鎖、作用ドメインチェーン.いつも硬伤です.このような问题にぶつかると头が大きくなります.でも、続けて言ったら、「できません.本当に助かります.」私の辞書にはこの言葉がないので、雄叫びをあげます.ちょうど昨日本城でJSの紅宝の本を読みましたが、まだ読み終わっていません.
Function-関数はJSで2つの使用方法があります.
(1)関数宣言:宣言と呼び出しには厳密な順序がない
1     Greet();    //executed correctly. there is not the strict order between declaration and invoking

2     //a standard statement of a function

3     function Greet (name) {

4         alert("Hello, " + (name || "JS"));

5     }
(2)関数式: 声明と呼び出しには順序があります.
1     //myFun();     //Wrong: Uncaught TypeError: Property 'myFun' of object [object Object] is not a function

2     //another statement: function expression

3     var myFun = function(name){

4         alert("Hello, " + (name || "JS"));

5     }

6     //like a variable, need to be declared firstly

7     myFun("Tom");
他の区分は覚えていませんが、後で娘さんに聞いてみます.現在は関数を使って階乗の再帰的実現を示しています.
1     function factorial (num) {

2         if(num == 1)

3             return 1;

4         else

5             return num * factorial(num-1);

6     }

7     alert(factorial(5));    // 120 - OK
正常な使用.ただし、JSではFunctionも対象であり、一般変数のように使用できます.具体的には関数の入り口の指針を指しています.依頼と似ています.不利には、関数全体の定義を目標変数に割り当てます.
1     //used as a variable

2     var fact = factorial;

3     alert(fact(5));        // 120 - OK
しかし、これは再帰的な実現であり、再帰的には繰り返し自身を呼び出すことである.上の使い方は、関数の実現過程を変数に委託して実行します.しかし、関数の中で自身の関数を呼び出しても元の関数に向かっています.この場合、元の関数を変更すると、結果は大きく変わります.
1     factorial = function(){return 1};

2     alert(fact(5));    //5 - effected by the original function
これは厳密ではないBugです.再帰的には、関数自体をアーグメンント.
1     // - correct usage

2     function factorial (num) {

3         if(num == 1)

4             return 1;

5         else    

6             return num * arguments.callee(num-1);

7     }
もう一つの使い方があります.
1     // mark

2     var myFactorial = (function f (num) {

3         if(num == 1)

4             return 1;

5         else

6             return num * f(num-1);

7     });

8     alert(myFactorial(5));    // 120
このような文法は見たことがありません.Mark.