高度なプログラミング:7章-関数式


関数式
関数式はJavaScriptの中の一つで、強くて困惑しやすい特性です.
関数式を定義する方法
1.関数宣言
function functionName(arg0,arg1,arg2){
    //   
}
まずFunctionキーワードがあります.そして関数の名前は関数名を指定する方式です.彼はもう一つの重要な特徴があります.関数宣言の向上の意味はコードを実行する前に関数声明を読みます.(関数宣言は呼び出し文の後に置くことができることを意味します)
sayHi()
function sayHi(){
    alert("Hi!");
}
2.関数式
関数式にはいくつかの異なる文法形式があります.
var functionName=function(arg0,arg1,arg2){
    //   
}
関数を作成し、変数functionNameに値を割り当てます.作成した関数は匿名関数と呼ばれます.functionキーワードの後ろに識別子がないからです.(匿名関数もラムダ関数と呼ばれる)匿名関数のname属性は空の文字列である.
再帰する
再帰関数は、一つの関数が名前で自身を呼び出した場合、以下のように構成されています.
function factorial(num){
    if(num<=1){
        return 1;
    }else{
        return num*factorial(num-1);
    }
}
1.argments.caleeは実行中の関数を指すポインタであるので、関数への再帰的な呼び出しを行うために使用できます.
function factorial(num){
    if(num<=1){
        return 1;
    }else{
        return num*arguments.callee(num-1);
    }
}
関数名の代わりにargments.calleeを使って、どのように関数を呼んでも問題がないことを確認できます.ただし、厳格なモードでアクセスすると、argments.calee属性がエラーになります.同じ結果を達成するためにネーミング関数式を使用できます.以下のとおりです
var factorial=(function f(num){
    if(num<=1){
        return 1;
    }else{
        return num*f(num-1);
    }
}
この方式は厳格モードと非厳格モードの両方で使用できる.
包みを閉じる
クローズドとは、別の関数のスコープにアクセスする変数の関数であり、クローズドパケットを作成する一般的な方法であり、関数の内部に別の関数を作成することである.以下のとおりです
function init(){
    var name="Mike";
    function displayName(){
        alert(name);
    }
    displayName();
}
init()
init関数は局所変数nameとdisplayName()という関数を作成しました.displayName()関数はinit()に定義されている内部関数で、この関数だけで使用されます.displayName()は独自の局所変数を持っていませんが、外部関数の変数にアクセスすることができますので、displayName()は親関数init()で宣言された変数nameを使用することができます.
注意:クローズドは、関数のスコープを携帯しますので、他の関数よりも多くのメモリを占有します.クローズドを使いすぎるとメモリの占有が多すぎるかもしれません.
this
大域関数では、thisはwindowに等しく、関数があるオブジェクトのメソッドとして呼び出された場合、thisはそのオブジェクトに等しくなります.しかし匿名関数の実行環境は大域的であるため、そのthisオブジェクトは通常windowを指す.
call()やappy()で関数を変えて環境を実行すると、thisは他のオブジェクトを指します.