JavaScriptの関数の3つの定義方法
3011 ワード
JavaScriptで関数が定義する3つの方法.
関数の3つの定義方法は、それぞれ、関数の定義文、関数の直接量式、およびFunction()の構造関数の方法です.これらの方法を順次紹介します.具体的にはどうやって実現しますか?
1.関数定義文
Function()コンストラクタにはもう一つの注意点があります.その作成された関数はワードスコープではなく、関数コードのコンパイルはトップ関数で行われます.下記のコードで示します.
関数の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つの定義方法は比較的に一般的である.