検索
ホームページウェブフロントエンドjsチュートリアルES5 の実行環境とスコープの詳細な紹介 (コード例)

この記事は、ES5 の実行環境とスコープに関する詳細な紹介 (コード例) を提供します。必要な方は参考にしていただければ幸いです。

まえがき: 最近『JavaScript Advanced Programming』を詳しく読んでいますが、私にとって中国語版は本書の多くの箇所に触れているので、私の理解している範囲で詳しく解釈してみます。 。間違いや漏れがございましたら、ご指摘いただければ幸いです。この記事の内容のほとんどは、『JavaScript Advanced Programming, Third Edition』から引用しています。

実行コンテキスト

実行コンテキスト (簡単にするために、実行コンテキストは環境になることもあります) は次のとおりです。 JavaScript で最も重要な概念。

実行環境は、他のデータにアクセスするための変数または関数の権限を定義し、それぞれの動作を決定します。

各実行環境には変数オブジェクトが関連付けられており、環境内で定義されたすべての変数と関数はこのオブジェクトに格納されます。

私たちが作成するコードはこのオブジェクトにアクセスできませんが、パーサーはデータを処理するときにバックグラウンドでこのオブジェクトを使用します。

グローバル実行環境は、最も周辺的な実行環境です。

ECMAScript が実装されるホスト環境に応じて、実行環境を表すオブジェクトも異なります。

Web ブラウザでは、グローバル実行環境はウィンドウ オブジェクトとみなされ、すべてのグローバル変数と関数はウィンドウ オブジェクトのプロパティとメソッドとして作成されます。

(変数のライフサイクル)、実行環境内のすべてのコードが実行された後、環境は破棄され、そこに保存されているすべての変数と関数定義も破棄されます)

グローバル実行環境は、Web ページやブラウザを閉じるなど、アプリケーションが終了するまで破棄されません。

各関数には独自の実行環境があります。実行フローが関数に入ると、関数の環境が環境スタックにプッシュされます。関数が実行されると、スタックはその環境をポップし、制御を前の実行環境に戻します。 ECMAScript プログラムの実行フローは、この便利なメカニズムによって制御されます。

スコープ チェーン

コードが環境内で実行されると、変数オブジェクトのスコープ チェーンが作成されます。
スコープ チェーンの目的は、実行環境にアクセスできるすべての変数と関数に確実に秩序正しくアクセスできるようにすることです。

スコープ チェーンのフロント エンドは常に、現在実行されているコードが配置されている環境の変数オブジェクトです。 (「近接原理」としても理解できます)。

この環境が関数の場合、その activation オブジェクト(activation object) を変数オブジェクトとして使用します。

関数実行環境のアクティブ オブジェクトには、最初は変数オブジェクトとして引数オブジェクト (このオブジェクトはグローバル環境には存在しません) が 1 つだけ含まれています。

スコープ チェーン内の次の変数オブジェクトは、それを含む (外部) 環境から取得され、次の変数オブジェクトは次の含まれる環境から取得され、以下同様にグローバル実行環境まで続きます。

グローバル実行環境の変数オブジェクトは、常にスコープ チェーンの最後のオブジェクトです。

識別子の解決は、スコープ チェーンに沿ってレベルごとに識別子を検索するプロセスです。
検索プロセスは常にスコープ チェーンの先頭から開始され、識別子が見つかるまでステップバイステップで逆方向に動作します (識別子が見つからない場合はエラーが発生します)。

var color = "blue";

function changeColor() {
    if(color === "blue") {
        color = "red";
    } else {
        color = "blue";
    }
}

changeColor();

console.log("Color is now " + color); // "color is now red"

この単純な例では、関数changeColor()のスコープチェーンには2つのオブジェクトが含まれています:

独自の変数オブジェクト(引数オブジェクトが定義されている)とグローバル環境変数オブジェクト。

変数 color はこのスコープ チェーン内にあるため、関数内でアクセスできます。

さらに、ローカル スコープで定義された変数は、ローカル環境でグローバル変数と同じように使用できます。

var color = "blue";

function changeColor() {
    var anotherColor = "red";

    function swapColors(){

        //这里可以访问color、anotherColor和tempColor
        var tempColor = anotherColor;
        anotherColor = color;
        color = tempColor;
    }

    //这里可以访问color和anotherColor,但不能访问tempColor
    swapColors();
}

//这里只能访问color
changeColor();

上記のコードには 3 つの実行環境が含まれます。

  • グローバル環境 (Web ブラウザのウィンドウ)

  • #ローカル環境関数changeColor()の環境

  • 関数swapColors()のローカル環境

グローバルには変数colorと関数changeColorがあります。環境 ()。 changeColor()のローカル環境にはanotherColorという変数とswapColors()という関数がありますが、グローバル環境の変数colorにもアクセスできます。 swapColors() のローカル環境には変数 tempColor があり、この環境でのみアクセスできます。

changeColor() のグローバル環境もローカル環境も tempColor にアクセスできません。

ただし、swapColors() 内では、他の 2 つの環境が親実行環境であるため、これらの環境の変数にアクセスできます。

      
 window, color, changeColor()
            |
    anotherColor, swapColors()
                    |
                tempColor

内部環境はスコープ チェーンを通じてすべての外部環境にアクセスできますが、外部環境は内部環境の変数や関数にはアクセスできません。

#これらの環境間の関係は線形かつ連続的です。

每个环境都可以向上搜索作用域链,以查询变量和函数名。但是,任何环境都不能通过向下搜索作用域链而进入另一个执行环境。

函数参数也被当做变量来对待,因此其访问规则与执行环境中的其他变量相同。

没有块级作用域(ES5中没有)

JavaScript没有块级作用域经常会导致理解上的困惑。
在其他类C的语言中,由花括号封闭的代码块都有自己的作用域(如果用ECMAScript的话来讲,就是它们自己的执行环境),因而支持根据条件来定义变量。

if(true) {
    var color = "blue";
}

console.log(color); //"blue"

这里是在有一个if语句中定义了变量color。
如果是在C、C++或Java中,color会在if语句执行完毕后被销毁。
但在JavaScript中,if语句中的变量声明会将变量添加当前的执行环境(在这里是全局环境window)中。

在使用for语句时尤其要牢记这一差异。

for(var i = 0; i <p>对于有块级作用域的语言来说,for语句初始化变量的表达式所定义的变量,只会存在于循坏的环境之中。而对于JavaScript来说,由for语句创建的变量i即使在for循环结束之后,也依旧会存在于循坏外部的执行环境中。</p><h3 id="声明变量">声明变量</h3><p><strong>使用var声明的变量会自动被添加到最接近的环境中,在函数内部,最接近的环境就是函数的局部环境。</strong></p><p>如果初始化变量时没有使用var声明,该变量会自动被添加到全局作用域。</p><pre class="brush:php;toolbar:false">function add(num1, num2) {
    var sum = num1 + num2;
    return sum;
}

var result = add(10,20); //30
console.log(sum); //sum is not defined

以上代码中的函数add()定义了一个名为sum的局部变量,该变量包含加法操作的结果。
虽然结果值从函数中返回了,但变量sum在函数外部是访问不到的。
如果省略这个例子中的var关键字,那么当add()执行完毕后,sum也将可以访问到。

function add(num1, num2) {
    sum = num1 + num2;
    return sum;
}

var result = add(10,20); // 30
console.log(sum); 30

在这个例子中的变量sum在被初始化赋值时没有使用var关键字。
于是,当调用完add()之后,添加到全局环境中的变量sum将继续存在。
即使函数已经执行完毕,后面的代码依旧可以访问它。

在编写JavaScript代码的过程中,不声明而直接初始化变量时一个常见的错误,这样会导致一些不可预估的意外。养成良好的习惯,在初始化变量之前,一定要先声明,这样就可以避免类似问题。在严格模式下,初始化未经声明的变量会导致错误。

2.查询标识符

当在某个环境中为了读取或写入而引用一个标识符时,必须通过搜索来确定该标识符实际代表什么。搜索过程从作用域链的前端开始,向上逐级查询与给定名字匹配的标识符。

如果在局部环境中找到了该标识符,搜索过程停止,变量就绪。

如果在局部环境中没有找到该变量,则继续沿作用域向上搜索。

搜索过程将一直追溯到全局环境的变量对象。

如果在全局环境中也没有找到这个标识符,则意味着该变量尚未声明。

var color = "blue";

function getColor() {
    return color;
}

console.log(getColor()); // "blue"

/*
window = {
    color,
    getColor = function() {
        return color;
    }
}
*/

调用本例中的函数getColor()时会引用变量color。

为了确定变量color的值,将开始一个两步的搜索过程。

  • 首先,在getColor()的局部环境中搜索变量对象,查找其中是否包含一个名为color的标识符。

  • 然后,没有找到,对不?那就到外面的环境中找,在全局作用域中找到名为color的标识符。

搜索到了定义这个变量的变量对象,搜索过程宣告结束。

在这个搜索过程中,如果存在一个局部的变量的定义,则搜索会自动停止(找到了,我就不找了),不再进入另一个变量对象。换句话说,如果局部环境中存在着同名标识符,就不会使用位于父环境中的标识符。

var color = "blue";

function getColor() {
    var color = "red";
    return color;
}

console.log(getColor()); //"red"

修改后的代码在getColor()函数中声明了一个名为color的局部变量。
调用函数时,该变量就会被声明。而当函数中的第二行代码执行时,意味着必须找到并返回变量color的值。
搜索过程,首先从局部环境中开始,而且在这里发现了一个名为color的变量,其值为“red”。
变量已经在函数的局部环境中找到了,所以搜索停止,return语句就使用这个局部变量,并为函数返回“red”。

如果不使用window.color都无法访问全局color变量。

变量查询也不是没有代价的。很明显,访问局部变量要比访问全局变量更快,因为不用向上搜索作用域链。JavaScript引擎在优化标识符查询方面做得不错,因此这个差别在将来恐怕可以忽略不记。

但是,我们还是要养成良好的编程习惯。虽说,这个差别可以忽略不记。

以上がES5 の実行環境とスコープの詳細な紹介 (コード例)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事はsegmentfaultで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。
es6数组怎么去掉重复并且重新排序es6数组怎么去掉重复并且重新排序May 05, 2022 pm 07:08 PM

去掉重复并排序的方法:1、使用“Array.from(new Set(arr))”或者“[…new Set(arr)]”语句,去掉数组中的重复元素,返回去重后的新数组;2、利用sort()对去重数组进行排序,语法“去重数组.sort()”。

JavaScript的Symbol类型、隐藏属性及全局注册表详解JavaScript的Symbol类型、隐藏属性及全局注册表详解Jun 02, 2022 am 11:50 AM

本篇文章给大家带来了关于JavaScript的相关知识,其中主要介绍了关于Symbol类型、隐藏属性及全局注册表的相关问题,包括了Symbol类型的描述、Symbol不会隐式转字符串等问题,下面一起来看一下,希望对大家有帮助。

原来利用纯CSS也能实现文字轮播与图片轮播!原来利用纯CSS也能实现文字轮播与图片轮播!Jun 10, 2022 pm 01:00 PM

怎么制作文字轮播与图片轮播?大家第一想到的是不是利用js,其实利用纯CSS也能实现文字轮播与图片轮播,下面来看看实现方法,希望对大家有所帮助!

JavaScript对象的构造函数和new操作符(实例详解)JavaScript对象的构造函数和new操作符(实例详解)May 10, 2022 pm 06:16 PM

本篇文章给大家带来了关于JavaScript的相关知识,其中主要介绍了关于对象的构造函数和new操作符,构造函数是所有对象的成员方法中,最早被调用的那个,下面一起来看一下吧,希望对大家有帮助。

JavaScript面向对象详细解析之属性描述符JavaScript面向对象详细解析之属性描述符May 27, 2022 pm 05:29 PM

本篇文章给大家带来了关于JavaScript的相关知识,其中主要介绍了关于面向对象的相关问题,包括了属性描述符、数据描述符、存取描述符等等内容,下面一起来看一下,希望对大家有帮助。

javascript怎么移除元素点击事件javascript怎么移除元素点击事件Apr 11, 2022 pm 04:51 PM

方法:1、利用“点击元素对象.unbind("click");”方法,该方法可以移除被选元素的事件处理程序;2、利用“点击元素对象.off("click");”方法,该方法可以移除通过on()方法添加的事件处理程序。

整理总结JavaScript常见的BOM操作整理总结JavaScript常见的BOM操作Jun 01, 2022 am 11:43 AM

本篇文章给大家带来了关于JavaScript的相关知识,其中主要介绍了关于BOM操作的相关问题,包括了window对象的常见事件、JavaScript执行机制等等相关内容,下面一起来看一下,希望对大家有帮助。

foreach是es6里的吗foreach是es6里的吗May 05, 2022 pm 05:59 PM

foreach不是es6的方法。foreach是es3中一个遍历数组的方法,可以调用数组的每个元素,并将元素传给回调函数进行处理,语法“array.forEach(function(当前元素,索引,数组){...})”;该方法不处理空数组。

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 脆弱性のいくつかを実践することです。このソフトウェアは、

PhpStorm Mac バージョン

PhpStorm Mac バージョン

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

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強力な PHP 統合開発環境