JavaScriptの関数の3つの定義方法


JavaScriptで関数が定義する3つの方法.
関数の3つの定義方法は、それぞれ、関数の定義文、関数の直接量式、およびFunction()の構造関数の方法です.これらの方法を順次紹介します.具体的にはどうやって実現しますか?
1.関数定義文
//    
function sum(a,b){
	return a+b;
}
これは最も典型的な関数宣言であり、キーワードfunctionで始まり、その後関数名識別子、ペアの括弧(0つ以上のカンマで区切られたパラメータ名を含む)と一対の括弧(0つ以上のJS文を含み、関数体を構成する)に従う.この関数の定義には明示的な指定関数名が必要であり、コード実行前にインタプリタによって作用領域にロードされ、この特性は関数定義の前に関数を呼び出すことができる.コードでこの点を検証できます.
console.log(sum);        //     sum      ,        
function sum(a,b){
	return a+b;
}
console.log(sum(2,3));   //5
関数宣言を言及するからには、関数のスコープに言及します.関数のスコープとは、関数内で宣言されたすべての変数が、関数内で常に見られます.これは、変数が宣言される前にすでに利用されていることを意味します.この特性は、宣言の前にすでに定義されていますが、この変数が実行された時にのみ本当の値が割り当てられます.コードでこの点がはっきり見えます.
var scope = "global";
function f(){
  console.log(scope);         //  “undefined”,   “global”
  var scope = "local";          //         ,                    
  console.log(scope);         //  “local”
}
f();
以上のコードは
var scope = "global";
function f() {
  var scope;                //            ,     
  console.log(scope);         //    ,  “undefined”,   “global”
  var scope = "local";       //           
console.log(scope);         //  “local”
}
f();
2.関数直接量式
//      
var factorial = function fact(x){   //          
	if(x<0) {return NaN;}
	else if(x===0) {return 1;}
	else
	return x*fact(x-1);     //    
};
console.log(factorial(3));      //6
関数定義語句と同様に、関数直接量表現もキーワードfunctionを使用しています.一般的にこのような定義は、大きな表現の一部として適用されます.例えば、賦値と呼び出し中に関数を定義します.関数の直接量によって生成された関数の名前は省略されます.このときは匿名関数です.以下の例に示すように、コードをよりコンパクトにすることができます.関数定義式は、一度だけ使用できる関数を定義するのに特に適しています.
var f=function(x){    //          
  return x*x;
}
関数の定義文とは違って、関数の直接量表現はコード実行時に関数をロードするので、下記のコードで説明できます.
console.log(f);        //     undefined,    f    
var f=function(x){     //      
  return x*x;
}
console.log(f);       //           
3.Function()構造関数
var f = new Function("x","y","return x+y");  //Function()    
var f = function(x,y){return x+y};  //         
Function()コンストラクタは、任意の数の文字列を入力して実際に参加することができます.最後の入力値は、関数体であり、任意の数のJavaScript文を含むことができます.作成した関数にパラメータが含まれていない場合は、関数体を一つだけ導入すればいいです.前の2つの方法とは異なり、Function()構成関数は、JavaScriptが動作中に動的に関数を作成し、翻訳することを可能にする.Function()を呼び出すたびに、関数体を解析し、新しい関数オブジェクトを作成します.したがって、このコンストラクタは循環または複数回起動した関数で実行され、実行効率に影響を与えます.対照的に、ループ中のネスト関数と関数定義式は、毎回実行されるごとにコンパイルされません.
Function()コンストラクタにはもう一つの注意点があります.その作成された関数はワードスコープではなく、関数コードのコンパイルはトップ関数で行われます.下記のコードで示します.
var a = 3;     //          a
function f(){
	var a = 2;   //           a
	return new Function("return a*a;");   //         
}
console.log(f()());     //     9  4,                
Function()構成関数は大域的な作用領域で実行されるeval()であると考えられます.実際のプログラミングではFunction()のコンストラクターはあまり使われず、前の2つの定義方法は比較的に一般的である.