JavaScriptにおける方法(Functionタイプ)


Function
関数はESの非常に重要な部分であり、関数も実際にオブジェクトである.各関数は、Functionタイプの例であり、他の参照タイプと同様に属性と方法を有する.関数はオブジェクトですので、関数名は実際に関数オブジェクトを指すポインタでもあり、関数とは結合されません.
定義関数
関数の定義には3つの方法があります.1つの関数は文法を宣言します.
function sum(num1, num2) {
	return num1 + num2;
}
二関数式
//      , 
var sum = function(num1, num2) {
	return num1 + num2;
};
三構造関数(推奨されていません)
//              ,    
var sum = new Function("num1", "num2", "return num1+num2");
重さがない(重点)
関数名をポインタにイメージして、ESには関数がないという概念を理解するのに役立ちます.以下の例では,二つの同名の関数を宣言し,結果として,前の関数を後の関数が覆っている.実際には、第二の関数を作成する際に、第一の関数を参照する変数addが上書きされます.
function add(num) {
	return num + 100;
}
function add(num) {
	return num + 200;
}
var result = add(100); 	// 300
関数宣言と関数式の違い
関数宣言は、関数式定義関数と同じように見えますが、実際には、解像度が実行環境にデータをロードするときには、まず関数宣言を読み取り、任意のコードを実行する前に使用できます.関数式については、解像度が彼のコード行に実行されるまで、本当に解釈されます.
言い換えれば、関数宣言によって定義された関数は、任意の位置で呼び出すことができます.関数式によって定義された関数は、式の後にしか呼び出されません.以前はエラーメッセージを呼び出します.
alert(sum(10, 10));	// 20
function sum(num1, num2){
	return num1 + num2;
}

// Uncaught TypeError: sum2 is not a function
alert(sum2(10, 10));
var sum2 = function(num1, num2){
	return num1 + num2;
};
関数を値として
ESの関数名自体が変数なので、関数は値としても使用できます.つまり、伝達パラメータのように一つの関数を別の関数に渡すだけでなく、関数を別の関数の結果として返すことができます.
上の言葉を理解することが必要です.この二つの方法はもっと効果的に特定の問題を解決することができます.
1.関数をパラメータとして
//                    ,         。
function callSomeFunction(someFunction, someArgument){
    return someFunction(someArgument);
}

function add(num) {
    return num + 10;
}
function get(str) {
    return "hello," + str; 
}

var result = callSomeFunction(add, 20);
var string = callSomeFunction(get, "talon");
alert(result);  // 30
alert(string);  // hello,talon
2.関数を戻り値として使う
関数を返す値としても有用です.例えば、私たちはsort()の方法を使ってオブジェクトのある属性によって並べ替える時に、sort()に伝達するパラメータ関数には様々な種類があります.関数を返す値として使う方法でこの問題を解決できます.
function createComparisonFunction(propertyName) {

    return function(obj1, obj2) {
        var value1 = obj1[propertyName];
        var value2 = obj2[propertyName];
        if(value1 < value2) {
            return -1;
        } else if (value1 > value2) {
            return 1;
        } else {
            return 0;
        }
    };
}

var data = [
    {name: "talon", age: 20},
    {name: "zjaya", age: 19}
];

//   name     
data.sort(createComparisonFunction("name"));
alert(data[0].name) // talon
//   age     
data.sort(createComparisonFunction("age"));
alert(data[0].name) // zjaya