「フロントエンド開発者が知っておくべき JS プロトタイプと継承」の記事で、クロージャに関する記事を書くと書きましたが、最近、クロージャ アプリケーションの機能を強化する必要があることに気づいたので、この記事を延期することはできません。もっと長く。この記事では関数クロージャについて説明しており、オブジェクト クロージャ (with の使用など) については説明しません。私の言ったことは間違っていると思われる場合は、お気軽にコメントしてアドバイスをください。
1. クロージャの理論
まず、次の概念を理解する必要があります。
実行環境
関数が呼び出されるたび (関数が呼び出されるとき)が実行されると)、システムは関数の閉じられたローカル実行環境、つまり関数の実行環境を作成します。関数は、ローカル変数、関数パラメータの読み書き、内部ロジックの実行など、常に独自の実行環境で実行されます。実行環境を作成するプロセスには関数のスコープの作成が含まれており、関数も独自のスコープ内で実行されます。別の観点から見ると、各関数実行環境にはスコープ チェーンがあり、子関数のスコープ チェーンには親関数のスコープ チェーンが含まれます。スコープとスコープチェーンについては以下を参照してください。
スコープ、スコープチェーン、呼び出しオブジェクト
関数スコープは字句スコープと動的スコープに分かれています。
レキシカルスコープは関数定義時のスコープ、つまり静的スコープです。関数が定義されると、その字句範囲が決定され、関数構造の入れ子関係に基づいて関数の範囲が記述されます。このとき、関数のスコープチェーンが形成されます。スコープ チェーンは、これらのスコープをネストされた階層関係で接続します。関数の内部 [[scope]] 属性は、このスコープ チェーンを指します。
動的スコープとは、関数呼び出しが実行されるときのスコープです。関数が呼び出されるとき、関数内の [[scope]] 属性は最初に関数のスコープ チェーンを指し、次に呼び出しオブジェクトが作成され、呼び出しオブジェクトは関数パラメーターとローカル変数を記録するために使用されます。関数を作成し、ドメイン チェーンの先頭に置きます。動的スコープは、呼び出し元のオブジェクトをスコープ チェーンの先頭に追加することによって作成されます。このとき、[[scope]] は定義時にスコープ チェーンを持つだけでなく、呼び出し時に呼び出し元のオブジェクトも作成されます。つまり、実行環境のスコープは、関数の定義時に決定されたスコープ チェーンに、関数によって作成されたばかりの呼び出しオブジェクトを加えたものと等しく、新しいスコープ チェーンが形成されます。したがって、これは動的スコープであり、スコープ チェーンもそれに応じて変化します。ここでスコープを見ると、実際にはオブジェクト チェーンです。これらのオブジェクトは、関数が呼び出されたときに作成される呼び出しオブジェクトと、その上の最上位のグローバル オブジェクトまでの呼び出しオブジェクトです。
たとえば、グローバル環境の関数 A に関数 B がネストされている場合、関数 B のスコープ チェーンは、関数 B のスコープ -> 関数 A のスコープ -> グローバル ウィンドウのスコープになります。 。関数Bが呼び出された場合、識別子を探す際には、関数Bのスコープ→関数Aのスコープ→グローバルウィンドウのスコープに従って検索されます。実際には、呼び出しに従って検索されます。関数Bのオブジェクト→関数Aの呼び出しオブジェクト→グローバルオブジェクトの順で検索されます。つまり、関数が呼び出されるとき、関数のスコープ チェーンは実際には呼び出し元のオブジェクト チェーンになります。
クロージャ
動的実行環境では、データはリアルタイムで変化します。これらの非永続変数の値を維持するために、これらの動的データを格納するキャリアとしてクロージャを使用します。以下の文を当てはめるとよく理解できるでしょう)。クロージャの定義: いわゆる「クロージャ」とは、多くの変数とこれらの変数にバインドされた環境を持つ式 (通常は関数) を指します。つまり、これらの変数も式の一部です。
クロージャは関数内にネストされた内部関数であり、内部関数はすべてのローカル変数、パラメータ、および外部関数で宣言された他の内部関数にアクセスできます。内部関数が外部関数の外部で呼び出される場合、クロージャが生成されます。 (実際には、どの関数もグローバルスコープの内部関数であり、グローバル変数にアクセスできるので、ウィンドウのクロージャになります)
例えば、以下の例:

前端开发趋势总是在不断发展,有些趋势会长期流行。本篇文章给大家总结了2023 年将突出的一些前端开发趋势,分享给大家~

昨天刚发了一篇Python桌面开发库大全的微头条,就被同事安利了Flet这个库。这是一个非常新的库,今年6月份才发布的第一个版本,虽然很新,但是它背靠巨人-Flutter,可以让我们使用Python开发全平台软件,虽然目前还不支持全平台,但是根据作者的计划,Flutter支持的,它以后都会支持的,昨天简单学习了一下,真的非常棒,把它推荐给大家。后面我们可以用它做一系列东西。什么是FletFlet是一个框架,允许用你喜欢的语言构建交互式多用户Web,桌面和移动应用程序,而无需拥有前端开发的经验。主

随着互联网的飞速发展,前端开发技术也在不断改进和迭代。PHP和Angular是两种广泛应用于前端开发的技术。PHP是一种服务器端脚本语言,可以处理表单、生成动态页面和管理访问权限等任务。而Angular是一种JavaScript的框架,可以用于开发单页面应用和构建组件化的Web应用程序。本篇文章将介绍如何使用PHP和Angular进行前端开发,以及如何将它们

掌握sessionStorage的作用,提升前端开发效率,需要具体代码示例随着互联网的快速发展,前端开发领域也日新月异。在进行前端开发时,我们经常需要处理大量的数据,并将其存储在浏览器中以便后续使用。而sessionStorage就是一种非常重要的前端开发工具,可以为我们提供临时的本地存储解决方案,提高开发效率。本文将介绍sessionStorage的作用,

node.red指Node-RED,是一款基于流的低代码编程工具,用于以新颖有趣的方式将硬件设备,API和在线服务连接在一起;它提供了一个基于浏览器的编辑器,使得我们可以轻松地使用编辑面板中的各种节点将流连接在一起,只需单击即可将其部署到其运行时。

前端开发中的JavaScript异步请求与数据处理经验总结在前端开发中,JavaScript是一门非常重要的语言,它不仅可以实现页面的交互和动态效果,还可以通过异步请求获取和处理数据。在这篇文章中,我将总结一些在处理异步请求和数据时的经验和技巧。一、使用XMLHttpRequest对象进行异步请求XMLHttpRequest对象是JavaScript用于发送

前端开发中,JavaScript路由和页面跳转是必不可少的一部分。一个好的路由方案和页面跳转实现可以带来优秀的用户体验和页面性能。在本篇文章中,我们将从JavaScript路由的基础知识以及页面跳转的常见实现方式进行探讨,分享一些在实践中获得的经验和总结。一、JavaScript路由基础知识为了更好的理解什么是JavaScript路由,我们需要先了解下前端路

Webman:提供强大的视觉效果和动画效果的前端开发框架前端开发在不断发展和进步的技术领域中扮演着重要的角色。随着互联网的普及和用户对用户体验的不断追求,前端开发需要更加强大且能够提供令人印象深刻的视觉效果和动画效果。Webman作为一种前端开发框架,致力于提供强大的视觉效果和动画效果,为开发者创造出独特而令人印象深刻的用户体验。Webman集成了丰富的前端


ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

mPDF
mPDF は、UTF-8 でエンコードされた HTML から PDF ファイルを生成できる PHP ライブラリです。オリジナルの作者である Ian Back は、Web サイトから「オンザフライ」で PDF ファイルを出力し、さまざまな言語を処理するために mPDF を作成しました。 HTML2FPDF などのオリジナルのスクリプトよりも遅く、Unicode フォントを使用すると生成されるファイルが大きくなりますが、CSS スタイルなどをサポートし、多くの機能強化が施されています。 RTL (アラビア語とヘブライ語) や CJK (中国語、日本語、韓国語) を含むほぼすべての言語をサポートします。ネストされたブロックレベル要素 (P、DIV など) をサポートします。

SublimeText3 英語版
推奨: Win バージョン、コードプロンプトをサポート!

Dreamweaver Mac版
ビジュアル Web 開発ツール

AtomエディタMac版ダウンロード
最も人気のあるオープンソースエディター

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境
