JSチュートリアル

JSホーム JSの紹介 JSどこへ JS出力 JSステートメント JS構文 JSコメント JS変数 JS Let JSConst JSオペレーター JS算術 JS割り当て JSデータ型 JS関数 JSオブジェクト JSイベント JS文字列 JS文字列メソッド JS文字列検索 JS文字列テンプレート JS番号 JS番号メソッド JSアレイ JS配列メソッド JS配列ソート JSアレイの反復 JSアレイ定数 JSの日付 JSの日付形式 JS DateGetメソッド JS日付設定メソッド JS数学 JSランダム JSブール値 JSの比較 JS条件 JSスイッチ JSループFor JSループフォーイン JSループの JSループWhile JSブレイク JSIterables JSセット JSマップ JS Typeof JS型変換 JSビット単位 JS RegExp JSエラー JSスコープ JSホイスト JS厳密モード JSこのキーワード JSアロー関数 JSクラス JS JSON JSデバッグ JSスタイルガイド JSのベストプラクティス JSの間違い JSパフォーマンス JS予約語

JSバージョン

JSバージョン JS 2009(ES5) JS 2015(ES6) JS 2016 JS 2017 JS 2018 JS IE /エッジ JSの歴史

JSオブジェクト

オブジェクト定義 オブジェクトのプロパティ オブジェクトメソッド オブジェクト表示 オブジェクトアクセサー オブジェクトコンストラクター オブジェクトのプロトタイプ オブジェクト反復可能 オブジェクトセット オブジェクトマップ オブジェクトリファレンス

JS関数

関数の定義 関数パラメーター 関数の呼び出し 関数呼び出し 機能適用 関数クロージャ

JSクラス

クラスイントロ クラス継承 クラス静的

JS非同期

JSコールバック JS非同期 JSの約束 JS Async / Await

JS HTML DOM

DOMイントロ DOMメソッド DOMドキュメント DOM要素 DOM HTML DOMフォーム DOM CSS DOMアニメーション DOMイベント DOMイベントリスナー DOMナビゲーション DOMノード DOMコレクション DOMノードリスト

JSブラウザBOM

JSウィンドウ JS画面 JSロケーション JSの歴史 JSナビゲーター JSポップアップアラート JSタイミング JSクッキー

JS Web API

WebAPIイントロ WebフォームAPI Web履歴API WebストレージAPI WebワーカーAPI Web Fetch API Web Geolocation API

JS AJAX

AJAXイントロ AJAX XMLHttp AJAXリクエスト AJAX応答 AJAXXMLファイル AJAX PHP AJAX ASP AJAXデータベース AJAXアプリケーション AJAXの例

JS JSON

JSONイントロ JSON構文 JSONとXML JSONデータ型 JSON解析 JSON文字列化 JSONオブジェクト JSON配列 JSONサーバー JSON PHP JSON HTML JSON JSONP

JSとjQuery

jQueryセレクター jQuery HTML jQuery CSS jQuery DOM

JSグラフィックス

JSグラフィックス JSキャンバス JSPlotly JS Chart.js JSグーグルチャート JS D3.js

JSの例

JSの例 JS HTML DOM JSHTML入力 JSHTMLオブジェクト JSHTMLイベント JSブラウザ JSエディター JS演習 JSクイズ JS証明書

JSリファレンス

JavaScriptオブジェクト HTMLDOMオブジェクト


JavaScriptクロージャ


JavaScript変数は、ローカルスコープまたは グローバルスコープに属することができます。

グローバル変数は、クロージャーを使用してローカル(プライベート)にすることができます


グローバル変数

Aは、次のように、関数functionで定義されたすべての変数にアクセスできます。

function myFunction() {
  let a = 4;
  return a * a;
}

ただし、次のように、関数の外部functionで定義された変数にアクセスすることもできます。

let a = 4;
function myFunction() {
  return a * a;
}

最後の例では、aグローバル 変数です。

Webページでは、グローバル変数はウィンドウオブジェクトに属します。

グローバル変数は、ページ内(およびウィンドウ内)のすべてのスクリプトで使用(および変更)できます。

最初の例では、aローカル 変数です。

ローカル変数は、それが定義されている関数内でのみ使用できます。他の関数や他のスクリプトコードからは隠されています。

同じ名前のグローバル変数とローカル変数は異なる変数です。一方を変更しても、もう一方は変更されません。

宣言キーワード(、、、または)なしで作成 た変数は、関数内で作成された場合でも、常にグローバルです。varletconst

function myFunction() {
  a = 4;
}


可変寿命

グローバル変数は、別のページに移動したりウィンドウを閉じたりするときのように、ページが破棄されるまで存続します。

ローカル変数の寿命は短いです。これらは、関数が呼び出されたときに作成され、関数が終了したときに削除されます。


カウンタージレンマ

何かを数えるために変数を使用し、このカウンターをすべての関数で使用できるようにしたいとします。

グローバル変数を使用してfunction、カウンターを増やすことができます。

// Initiate counter
let counter = 0;

// Function to increment counter
function add() {
  counter += 1;
}

// Call add() 3 times
add();
add();
add();

// The counter should now be 3

上記の解決策には問題があります。ページ上のどのコードでも、add()を呼び出さなくてもカウンターを変更できます。

add()他のコードがカウンターを変更しないように、カウンターは関数に対してローカルである必要があります。

// Initiate counter
let counter = 0;

// Function to increment counter
function add() {
  let counter = 0;
  counter += 1;
}

// Call add() 3 times
add();
add();
add();

//The counter should now be 3. But it is 0

ローカルカウンターの代わりにグローバルカウンターを表示するため、機能しませんでした。

関数に返させることで、グローバルカウンターを削除し、ローカルカウンターにアクセスできます。

// Function to increment counter
function add() {
  let counter = 0;
  counter += 1;
  return counter;
}

// Call add() 3 times
add();
add();
add();

//The counter should now be 3. But it is 1.

関数を呼び出すたびにローカルカウンターをリセットするため、機能しませんでした。

 JavaScriptの内部関数でこれを解決できます。


JavaScriptの入れ子関数

すべての関数はグローバルスコープにアクセスできます。  

実際、JavaScriptでは、すべての関数がその「上」のスコープにアクセスできます。

JavaScriptはネストされた関数をサポートします。ネストされた関数は、それらの「上」のスコープにアクセスできます。

この例では、内部関数は親関数plus()の変数にアクセスできます。counter

function add() {
  let counter = 0;
  function plus() {counter += 1;}
  plus();   
  return counter;
}

plus() 外部から機能に到達できれば、これでカウンターのジレンマを解決できたはずです。

また、一度だけ実行する方法を見つける必要がありますcounter = 0

閉鎖が必要です。


JavaScriptクロージャ

自己呼び出し関数を覚えていますか?この関数は何をしますか?

const add = (function () {
  let counter = 0;
  return function () {counter += 1; return counter}
})();

add();
add();
add();

// the counter is now 3

例の説明

変数addは、自己呼び出し関数の戻り値に割り当てられます。

自己呼び出し機能は1回だけ実行されます。カウンターをゼロ(0)に設定し、関数式を返します。

このようにして、addは関数になります。「素晴らしい」部分は、親スコープのカウンターにアクセスできることです。

これはJavaScriptクロージャと呼ばれます。関数が「プライベート」変数を持つことを可能にします。

カウンターは無名関数のスコープによって保護されており、add関数を使用してのみ変更できます。

クロージャは、親関数が閉じられた後でも、親スコープにアクセスできる関数です。