検索
ホームページウェブフロントエンドjsチュートリアルJavaScriptのスコープとクロージャの使い方を詳しく解説_基礎知識

スコープのネストはスコープチェーンを形成し、関数のネストはクロージャを形成します。クロージャとスコープ チェーンは、JavaScript を他の言語と区別する重要な機能の 1 つです。

スコープ
JavaScript には、関数スコープとグローバル スコープの 2 種類のスコープがあります。

関数内で宣言された変数と関数のパラメーターは同じスコープ、つまり関数スコープを共有します。関数スコープの簡単な例:

コードをコピー コードは次のとおりです。

function foo() {
var bar = 1 ;
{
var bar = 2;
}
return bar; // 2
}

C などの他のブロックスコープ言語とは異なり、これは常に 2 を返します。

ブラウザーのグローバル スコープは、ウィンドウ オブジェクトとして理解できます (Node.js はグローバルです):

コードをコピーコードは次のとおりです。

var bar = 1;
function foo() {}
alert(window.bar) // 1
alert(window.foo) ) ; // "関数 foo() {}"

変数 bar と関数 foo は両方ともグローバル スコープに属し、両方とも window の属性です。

スコープ チェーン
JavaScript で変数にアクセスする場合、ローカル変数とパラメーターから開始され、グローバル スコープに到達するまでスコープを段階的に移動します。

コードをコピー コードは次のとおりです:

varscope = 0, zero = "global -scope" ;
(function(){
var スコープ = 1, one = "scope-1";
(function(){
var スコープ = 2, two = "scope-2" ";
(function(){
varscope = 3, three = "scope-3";
scope-1 global-scope
console.log([three, two, one, zero ].join(" "));
console.log(scope) // 3
}); 🎜> console.log(scope) // 2
});
console.log(typeof two); // 未定義
console.log(scope); // 1
})();
console.log(typeof one); 🎜>console.log(scope); // 0



最も内側の関数では、各変数をステップごとに調べて出力できます。関数の最後から 2 番目の層では、変数 3 がトラバーサルで見つからないため、unknown が出力されます。
簡単な例を挙げると、何かを買うためにお金を出そうとするとき、まず財布を触ります。もし持っていなければ、お父さんにそれを求めます。それはおじいちゃんに聞いてみるといいよ...そして、あなたのお父さんが何かを買うお金がないとき、彼はあなたのところにそれを求めに来ません。

クロージャ

ある関数で別の関数を定義することを関数の入れ子と呼びます。関数をネストするとクロージャが形成されます。

クロージャとスコープ チェーンは相互に補完し、関数をネストすると、チェーン関係に複数のスコープが作成されるだけでなく、クロージャも形成されます。


コードをコピー コードは次のとおりです。function binding(func, target) {
return function() {
func.apply(target, argument);
};
}



では、クロージャをどのように理解すればよいでしょうか?
外部関数は組み込み関数にアクセスできません

外部関数は組み込み関数のパラメータや変数にアクセスできません

ただし、組み込み関数は外部関数のパラメータや変数にアクセスできます

言い換えると、組み込み関数には、外部関数
前述のスコープ チェーンの例を見てみましょう。今回はクロージャの観点から理解します。


コードをコピー コードは次のとおりです:

var スコープ = 0, ゼロ = "グローバル スコープ";
(function(){
var スコープ = 1, one = "スコープ-1";
(function() {
varscope = 2, two = "scope-2";
(function(){
varscope = 3, three = "scope-3";
// スコープ 3 スコープ-2 スコープ-1 グローバルスコープ
console.log([three, two, one, zero].join(" "));
console.log(scope); // 3
}) ();
console.log(typeof three); // 未定義
console.log(scope) // 2
});
console.log(typeof two); / 未定義
console.log(scope); // 1
})();
console.log(typeof one); // 未定義
console.log(scope);

最も内側の関数は、内部および外部で定義されたすべての変数にアクセスできます。最後から 2 番目の層の関数は、最内層の変数にアクセスできません。同時に、最内層のスコープ = 3 の代入操作は、同じ名前の外部変数には影響しません。

クロージャを別の角度から理解してみましょう:

外部関数が呼び出されるたびに、埋め込み関数が一度作成されます。
作成されると、外部関数のスコープ (ローカル変数、パラメータなどのコンテキストを含む) が各埋め込み関数オブジェクトになります。外部関数が実行を完了して終了した後でも、内部状態の一部
次の例を参照してください:

コードをコピー コードは次のとおりです。

var i, list = [];
for (i = 0; i list.push(function(){
console.log(i);
});
}
list .forEach(function(func){
func();
});

予想される "1" と "2" の代わりに "2" が 2 回取得されます。これは、リスト内の 2 つの関数によってアクセスされる変数 i が、上位スコープ内の同じ変数であるためです。

この問題を解決するためにクロージャを使用するようにコードを変更しましょう:

コードをコピー コードは次のとおりです。

var i, list = [];
for (i = 0; i list.push((function(j){
) return function(){
console.log(j);
} ;
})(i));
}
list.forEach(function(func){
func();
});

外側の「即時実行関数」は、関数内にパラメーター j の形式で存在するパラメーター変数 i を受け取り、返された内部関数内の名前 j と同じ参照を指します。外側の関数が実行されて終了すると、パラメーター j (その値はこの時点での i の現在の値) が内側の関数の状態の一部となり、保存されます。

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
Linux多线程编程锁详解:如何避免竞争和死锁Linux多线程编程锁详解:如何避免竞争和死锁Feb 11, 2024 pm 04:30 PM

在Linux多线程编程中,锁是一种非常重要的机制,可以避免线程间的竞争和死锁。然而,如果不正确使用锁,可能会导致性能下降和不稳定的行为。本文将介绍Linux中的常见锁类型,如何正确使用它们,以及如何避免竞争和死锁等问题。在编程中,引入了对象互斥锁的概念,来保证共享数据操作的完整性。每个对象都对应于一个可称为”互斥锁”的标记,这个标记用来保证在任一时刻,只能有一个线程访问该对象。Linux实现的互斥锁机制包括POSIX互斥锁和内核互斥锁,本文主要讲POSIX互斥锁,即线程间互斥锁。信号量用在多线程

switch case 内变量的范围switch case 内变量的范围Feb 09, 2024 am 09:00 AM

packagemainimport"fmt"funcmain(){x:=10switchx{case0:y:='a'fmt.Printf("%c\n",y)case1://y='b'//thiscan'tcompile,y:='b'fmt.Printf("%c\n",y)default:y:=

详解Golang函数中的变量作用域详解Golang函数中的变量作用域Jan 18, 2024 am 08:51 AM

Golang函数中的变量作用域详解在Golang中,变量的作用域指的是变量的可访问范围。了解变量的作用域对于代码的可读性和维护性非常重要。在本文中,我们将深入探讨Golang函数中的变量作用域,并提供具体的代码示例。在Golang中,变量的作用域可以分为全局作用域和局部作用域。全局作用域指的是在所有函数外部声明的变量,即在函数之外定义的变量。这些变量可以在整

掌握JavaScript函数的嵌套和作用域掌握JavaScript函数的嵌套和作用域Nov 03, 2023 pm 07:55 PM

掌握JavaScript函数的嵌套和作用域,需要具体代码示例在JavaScript编程中,函数是非常重要的概念。函数的嵌套和作用域能够极大地提高代码的可读性和灵活性。本文将介绍如何正确地使用嵌套函数和作用域,并提供具体的代码示例。函数的嵌套可以理解为在一个函数中定义了另一个函数。这种嵌套的方式能够将代码分成多个小块,使得程序的逻辑更加清晰。同时,嵌套函数还可

Python Lambda表达式:让编程变得更轻松Python Lambda表达式:让编程变得更轻松Feb 19, 2024 pm 09:54 PM

pythonLambda表达式是一个小的匿名函数,它可以将一个表达式存储在变量中并返回它的值。Lambda表达式通常用于执行简单的任务,这些任务可以通过编写一个单独的函数来完成,但Lambda表达式可以使代码更简洁和易读。Lambda表达式的语法如下:lambdaarguments:expressionarguments是Lambda表达式接收的参数列表,expression是Lambda表达式的体,它包含需要执行的代码。例如,以下Lambda表达式将两个数字相加并返回它们的和:lambdax,

c语言static的作用和用法是什么c语言static的作用和用法是什么Jan 31, 2024 pm 01:59 PM

c语言static的作用和用法:1、变量作用域;2、生命周期;3、函数内部;4、修饰全局变量;5、修饰函数;6、其他用途;详细介绍:1、变量作用域,当一个变量前有static关键字,那么这个变量的作用域被限制在声明它的文件内,也就是说,这个变量是“文件级作用域”,这对于防止变量的“重复定义”问题很有用;2、生命周期,静态变量在程序开始执行时初始化一次,并在程序结束时销毁等等。

如何解决Python的变量未定义错误?如何解决Python的变量未定义错误?Jun 24, 2023 pm 10:12 PM

Python是一种高级编程语言,它的易用性和流行程度使得它成为了众多程序员的首选语言。与其他语言一样,Python也存在一些常见的错误类型,例如变量未定义错误。当我们在Python中使用一个未定义的变量时,程序就会抛出一个名为“NameError”的异常。这种错误通常出现在以下几种情况下:拼写错误:可能是因为变量名拼写错误导致了变量未定义错误,我们需要仔细检

JavaScript const关键字的用法及作用JavaScript const关键字的用法及作用Feb 19, 2024 pm 06:30 PM

JavaScript中const的作用和用法JavaScript是一种广泛应用于网页开发的编程语言,其具有灵活性和动态性是其特点之一。在JavaScript中,我们可以使用const关键字来声明一个常量。本文将介绍const关键字的作用和用法,并提供一些具体的代码示例来帮助读者更好地理解。const的作用const(常量)是一种用于声明不可更改的变量的关键字

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

DVWA

DVWA

Damn Vulnerable Web App (DVWA) は、非常に脆弱な PHP/MySQL Web アプリケーションです。その主な目的は、セキュリティ専門家が法的環境でスキルとツールをテストするのに役立ち、Web 開発者が Web アプリケーションを保護するプロセスをより深く理解できるようにし、教師/生徒が教室環境で Web アプリケーションを教え/学習できるようにすることです。安全。 DVWA の目標は、シンプルでわかりやすいインターフェイスを通じて、さまざまな難易度で最も一般的な Web 脆弱性のいくつかを実践することです。このソフトウェアは、

AtomエディタMac版ダウンロード

AtomエディタMac版ダウンロード

最も人気のあるオープンソースエディター

Dreamweaver Mac版

Dreamweaver Mac版

ビジュアル Web 開発ツール

PhpStorm Mac バージョン

PhpStorm Mac バージョン

最新(2018.2.1)のプロフェッショナル向けPHP統合開発ツール

SecLists

SecLists

SecLists は、セキュリティ テスターの究極の相棒です。これは、セキュリティ評価中に頻繁に使用されるさまざまな種類のリストを 1 か所にまとめたものです。 SecLists は、セキュリティ テスターが必要とする可能性のあるすべてのリストを便利に提供することで、セキュリティ テストをより効率的かつ生産的にするのに役立ちます。リストの種類には、ユーザー名、パスワード、URL、ファジング ペイロード、機密データ パターン、Web シェルなどが含まれます。テスターはこのリポジトリを新しいテスト マシンにプルするだけで、必要なあらゆる種類のリストにアクセスできるようになります。