ホームページ > ウェブフロントエンド > jsチュートリアル > JavaScript 匿名関数はブロックレベルのscope_javascript スキルを模倣します

JavaScript 匿名関数はブロックレベルのscope_javascript スキルを模倣します

WBOY
リリース: 2016-05-16 15:26:12
オリジナル
1607 人が閲覧しました

匿名関数

関数は JavaScript で最も柔軟なオブジェクトです。ここではその匿名関数の使用法のみを説明します。

匿名関数: 関数名のない関数です。

関数の定義では、まず関数の定義を簡単に紹介します。大きく分けて 3 つの方法があります

最初のタイプ: これも最も一般的なタイプです

function double(x){
  return 2 * x;  
}
ログイン後にコピー

2 番目の方法: このメソッドは Function コンストラクターを使用し、パラメーター リストと関数本体の両方を文字列として扱います。これは非常に不便なので、お勧めできません。

var double = new Function('x', 'return 2 * x;');
ログイン後にコピー

3 番目のタイプ:

var double = function(x) { return 2* x; }
ログイン後にコピー

なお、「=」の右側の関数は関数作成後、変数 square に代入されます。

JavaScript にはブロックレベルのスコープという概念がありません。つまり、ブロックレベルのステートメントで定義された変数は、実際にはステートメント内ではなく、それを含む関数 (外部関数) 内で作成されます。

function outputNumber(count){ 
  for(var i=0;i<1000;i++){ 
    alert(i); 
  } 
  alert(i);  //count 
} 
ログイン後にコピー

Java や C# などの言語のこの関数では、変数 i は for ループ ステートメント内でのみ定義され、ループが終了すると i は破棄されます。しかし、JavaScript では、変数 i は、outputNumber() アクティビティ オブジェクトで定義されるため、定義されるとすぐに関数内でアクセスできます。同じ変数を再宣言しても値は変わりません。

function outputNumber(count){ 
  for(var i=0;i<1000;i++){ 
    alert(i); 
  } 
  var i;   //重新声明变量 
  alert(i);  //count 
} 
ログイン後にコピー

匿名関数を使用すると、ブロックレベルのスコープを模倣し、この問題を回避できます。ブロックレベルのスコープ (プライベートスコープとも呼ばれます) として使用される匿名関数の構文は次のとおりです。

(function(){ 
   //这是块级作用域 
})() 
ログイン後にコピー
上記のコード定義は匿名関数を呼び出し、関数宣言を括弧で囲んで、それが関数式であることを示しています。これに続く別の括弧のペアは、関数をすぐに呼び出します。

一時的に変数が必要な場合は、プライベート スコープを使用できます。たとえば、

function outputNumber(count){ 
  (function(){ 
  for(var i=0;i<1000;i++){ 
    alert(i); 
  })(); 
  alert(i);  //导致一个错误 
} 
ログイン後にコピー
このようにして、for ループの外側にプライベート スコープを挿入します。無名関数で定義された変数は実行の終了時に破棄されます。


この手法は、グローバル スコープへの変数や関数の追加が多すぎることを制限するために、グローバル スコープの関数の外でよく使用されます。


一般に、グローバル スコープへの変数や関数の追加は最小限に抑えるように努めるべきです。


このアプローチでは、匿名関数への参照がなく、関数が実行されている限りそのスコープ チェーンはすぐに破棄できるため、クロージャがメモリを占有する問題を軽減できます。


ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート