ホームページ >ウェブフロントエンド >jsチュートリアル >Javascriptの関数、再帰、クロージャの使い方を詳しく解説(実行環境、変数オブジェクト、スコープチェーン)_基礎知識
関数式
1. JavaScript で関数を定義するには 2 つの方法があります:
1-1. 関数宣言:
1-2. 関数式:
alert("こんにちは!");
}
} else {
functionsayHi(){
alert( "Yo!");
}
}
ブラウザーの JavaScript エンジンはエラーの違いを修正します。ほとんどのブラウザーは条件を無視して 2 番目のステートメントを返します。FF は条件を返します。条件は true の場合、最初のステートメントを返します。
sayHi = function(){
alert("Hi!");
}
} else {
sayHi = function (){
alert("Yo!");
}
}
alert(anotherFactorial(4)) //24
非厳密モードでは、再帰関数を使用する場合、関数名の代わりに argument.callee を使用する方が安全です。
厳密モードでは、argument.callee を使用するとエラーが発生します。 関数式を使用できます。関数宣言の代わりに:
var fastial = function f(num){
if (num return 1;
} else {
return num * f(num-1);
}
}
は、別の関数のスコープ内の変数にアクセスできる関数を指します。 (一般的な形式は関数の入れ子です)
実行環境内のコードが実行されると、その環境は破棄され、そこに保存されている変数や関数定義も破棄されます。 ②コードが環境内で実行されると、実行環境がアクセスできるすべての変数と関数に順序よくアクセスできるように、変数オブジェクトのスコープ チェーンが作成されます。
スコープチェーンのフロントエンドは常に、現在実行されているコードが配置されている環境の変数オブジェクトです。環境が関数の場合、アクティブ オブジェクトは変数オブジェクトとして使用されます。 アクティブなオブジェクトには、最初は引数オブジェクトという変数が 1 つだけ含まれています。
スコープチェーン内の次の変数オブジェクトは包含環境から取得され、次の変数オブジェクトは次の包含環境から取得され、グローバル実行環境に継続されます。
③識別子の解析: 前の段落から始まり、スコープチェーンに沿ってレベルごとに識別子を検索するプロセス。 【見つからない場合は通常エラーになります】
4-2. 関数を作成して実行する場合:
コードをコピーします
4-3. クロージャのスコープチェーン
別の関数内で定義された関数は、その関数を含むアクティブなオブジェクトをそのスコープ チェーンに追加します。
①関数オブジェクトを null に代入することは、関数のスコープ チェーンが破棄されると、そのスコープ チェーン (グローバル スコープを除く) も安全に破棄されます。
②クロージャはそれを含む関数のスコープを持つため、他の関数よりも多くのメモリを消費します。
4-4. クロージャと変数
スコープチェーンの副作用: クロージャは、それを含む関数内の変数の最後の値しか取得できません。
匿名関数の実行環境はグローバルであり、その this オブジェクトは通常 window を参照します。 call() または apply() を通じて関数の実行環境を変更する場合、this はそのオブジェクトを指します。 ①各関数が呼び出されると、thisとargumentの2つの特殊変数が自動的に取得されます。内部関数がこれら 2 つの変数を検索する場合、有効期限が切れたアクティブ オブジェクトまでのみ検索され、外部関数のこれら 2 つの変数にアクセスすることはできません。 ただし、this オブジェクトをクロージャがアクセスできる変数の外部スコープに格納することで、クロージャはオブジェクトにアクセスできるようになります。
コードをコピー
var name = "The Window";
var object = {
name : "My Object",
getNameFunc: function(){
var that = this;
return function(){
return that.name;
};
}
};
alert(object.getNameFunc()()); //"MyObject"
5. Convert function declaration to function expression
JavaScript puts the function keyword at the beginning of the function declaration, but the function declaration cannot be followed by parentheses, so function(){......}(); will cause an error.
To convert a function declaration into a function expression, add a pair of parentheses to the function declaration: