목차
1 . 전역 초기화
2. 실행 함수 A
3. 함수 B 실행
简单的总结语
웹 프론트엔드 JS 튜토리얼 모든 프로그래머가 알아야 할 자바스크립트 정의부터 실행까지 상세 소개

모든 프로그래머가 알아야 할 자바스크립트 정의부터 실행까지 상세 소개

Mar 10, 2017 pm 02:43 PM

JS 엔진은 정의부터 실행까지 구현 계층에서 많은 초기화 작업을 수행합니다. 따라서 JS 엔진의 작동 메커니즘을 배우기 전에 몇 가지 관련 개념을 소개해야 합니다. 실행 환경 스택, 전역 개체, 실행 환경, 변수 개체, 활성 개체, 범위 및 범위 체인 등. 이러한 개념은 JS 엔진의 핵심 구성 요소입니다. 이 기사의 목적은 각 개념을 개별적으로 설명하는 것이 아니라 간단한 데모를 사용하여 분석을 수행하고 정의부터 실행까지 JS 엔진의 모든 세부 사항과 이러한 개념이 수행하는 역할을 포괄적으로 설명하는 것입니다.

var x = 1;  //定义一个全局变量 x
function A(y){
   var x = 2;  //定义一个局部变量 x
   function B(z){ //定义一个内部函数 B
       console.log(x+y+z);
   }
   return B; //返回函数B的引用
}
var C = A(1); //执行A,返回B
C(1); //执行函数B
로그인 후 복사

이 데모는 종료이며 실행 결과는 4입니다. 전역 초기화, 실행 함수 A, 실행 함수 B JS 엔진의 작동 메커니즘을 분석하는 3단계:

1 . 전역 초기화

JS 엔진이 실행 가능한 코드 조각을 입력할 때 다음 세 가지 초기화 작업을 완료해야 합니다.

먼저 전역 객체(Global Object)를 생성합니다. 이 개체의 복사본 하나는 전역적으로 어디에서나 액세스할 수 있으며 응용 프로그램 수명 전반에 걸쳐 존재합니다. 전역 객체 생성 시 Math, String, Date, document 등 일반적으로 사용되는 JS 객체를 속성으로 사용합니다. 이 전역 객체는 이름으로 직접 접근할 수 없기 때문에 또 다른 속성 윈도우가 있고, 윈도우가 자신을 가리키므로 윈도우를 통해 전역 객체에 접근할 수 있다. 의사 코드로 시뮬레이션된 전역 개체의 일반적인 구조는 다음과 같습니다.

//创建一个全局对象
var globalObject = { 
    Math:{},
    String:{},
    Date:{},
    document:{}, //DOM操作
    ...
    window:this //让window属性指向了自身
}
로그인 후 복사

그런 다음 JS 엔진은 실행 환경 스택(Execution Context Stack)을 구축해야 합니다. ) 동시에 전역 실행 환경(실행 컨텍스트) EC도 생성하고 이 전역 실행 환경 EC를 실행 환경 스택에 푸시합니다. 실행 환경 스택의 기능은 프로그램이 올바른 순서로 실행될 수 있도록 보장하는 것입니다. JavaScript에서는 각 함수마다 고유한 실행 환경이 있습니다. 함수가 실행되면 해당 함수의 실행 환경이 실행 환경 스택의 맨 위로 푸시되고 실행 권한을 얻습니다. 함수의 실행이 완료되면 해당 실행 환경은 스택 상단에서 제거되고 실행 권한은 이전 실행 환경으로 반환됩니다. 실행 환경 스택과 EC 간의 관계를 시뮬레이션하기 위해 의사 코드를 사용합니다.

var ECStack = []; //定义一个执行环境栈,类似于数组

var EC = {};   //创建一个执行空间,
//ECMA-262规范并没有对EC的数据结构做明确的定义,你可以理解为在内存中分配的一块空间

ECStack.push(EC); //进入函数,压入执行环境
ECStack.pop(EC);  //函数返回后,删除执行环境
로그인 후 복사

마지막으로 JS 엔진은 다음과 연관된 전역 변수 객체(Varibale)도 생성합니다. EC 객체) VO, 전역 객체를 가리키는 VO. VO는 전역 객체의 원래 속성을 포함할 뿐만 아니라 전역적으로 정의된 변수 x와 함수 A도 포함합니다. 동시에 함수 A를 정의할 때 추가됩니다. 내부 특성 범위를 만들고 범위를 VO로 지정합니다. 각 함수가 정의되면 해당 함수와 관련된 범위 속성이 생성됩니다. 범위는 항상 함수가 정의된 환경을 가리킵니다. 이때 ECStack 구조는 다음과 같습니다.

ECStack = [   //执行环境栈
    EC(G) = {   //全局执行环境
        VO(G):{ //定义全局变量对象
            ... //包含全局对象原有的属性
            x = 1; //定义变量x
            A = function(){...}; //定义函数A
            A[[scope]] = this; //定义A的scope,并赋值为VO本身
        }
    }
];
로그인 후 복사

2. 실행 함수 A

실행이 A(1)에 들어가면 JS 엔진은 다음 작업을 완료해야 합니다.

먼저 JS 엔진은 함수 A의 실행 환경 EC를 생성한 다음 EC를 실행 환경 스택의 최상위로 푸시하고 실행 권한을 얻습니다. 이때 실행 환경 스택에는 전역 실행 환경과 함수 A의 실행 환경이라는 두 가지 실행 환경이 있습니다. A의 실행 환경은 스택의 맨 위에 있고 전역 실행 환경은 맨 아래에 있습니다. 스택의. 그런 다음 함수 A의 범위 체인(Scope Chain)을 만듭니다. JavaScript에서는 각 실행 환경에 식별자 확인을 위한 자체 범위 체인이 있습니다. 실행 환경이 생성되면 범위 체인이 초기화됩니다. 현재 실행 중인 함수의

그러면 JS 엔진은 현재 함수의 활성화 객체(Activation Object) AO를 생성하게 되는데 여기서 액티비티 객체는 변수 객체의 역할을 하는데 함수에서는 그 이름이 다르다고 생각할 수 있습니다. 변수 객체의 개념은 일반적인 개념이고 활성 객체는 그것의 가지입니다.) AO에는 함수의 형식 매개변수, 인수 객체, 이 객체, 지역 변수 및 내부 함수의 정의, 그리고 AO가 포함됩니다. 스코프 체인 상단으로 밀려납니다. 함수 B를 정의할 때 JS 엔진은 범위 속성을 B에 추가하고 함수 B가 정의된 환경에 대한 범위를 가리킵니다. 함수 B가 정의된 환경은 A의 활성 개체 AO입니다. AO는 연결리스트의 맨 앞에 위치한다. 연결리스트는 끝과 끝이 연결되어 있기 때문에 함수 B의 범위는 A의 전체 범위 체인을 가리킨다. 이번에는 ECStack 구조를 살펴보겠습니다.

ECStack = [   //执行环境栈
    EC(A) = {   //A的执行环境
        [scope]:VO(G), //VO是全局变量对象
        AO(A) : { //创建函数A的活动对象
            y:1,
            x:2,  //定义局部变量x
            B:function(){...}, //定义函数B
            B[[scope]] = this; //this指代AO本身,而AO位于scopeChain的顶端,因此B[[scope]]指向整个作用域链
            arguments:[],//平时我们在函数中访问的arguments就是AO中的arguments
            this:window  //函数中的this指向调用者window对象
        },
        scopeChain:<AO(A),A[[scope]]>  //链表初始化为A[[scope]],然后再把AO加入该作用域链的顶端,此时A的作用域链:AO(A)->VO(G)
    },
    EC(G) = {   //全局执行环境
        VO(G):{ //创建全局变量对象
            ... //包含全局对象原有的属性
            x = 1; //定义变量x
            A = function(){...}; //定义函数A
            A[[scope]] = this; //定义A的scope,A[[scope]] == VO(G)
        }
    }
];
로그인 후 복사

3. 함수 B 실행

함수 A가 실행된 후 B가 참조됩니다. 변수 C에 할당된 경우 C(1)을 실행하는 것은 B(1)을 실행하는 것과 동일합니다. JS 엔진은 다음 작업을 완료해야 합니다.

首先,还和上面一样,创建函数B的执行环境EC,然后EC推入执行环境栈的顶部并获取执行权。 此时执行环境栈中有两个执行环境,分别是全局执行环境和函数B的执行环境,B的执行环境在栈顶,全局执行环境在栈的底部。(注意:当函数A返回后,A的执行环境就会从栈中被删除,只留下全局执行环境)然后,创建函数B的作用域链,并初始化为函数B的scope所包含的对象,即包含了A的作用域链。最后,创建函数B的活动对象AO,并将B的形参z, arguments对象 和 this对象作为AO的属性。此时ECStack将会变成这样:

ECStack = [   //执行环境栈
    EC(B) = {   //创建B的执行环境,并处于作用域链的顶端
        [scope]:AO(A), //指向函数A的作用域链,AO(A)->VO(G)
        var AO(B) = { //创建函数B的活动对象
            z:1,
            arguments:[],
            this:window
        }
        scopeChain:<AO(B),B[[scope]]>  //链表初始化为B[[scope]],再将AO(B)加入链表表头,此时B的作用域链:AO(B)->AO(A)-VO(G)
    },
    EC(A), //A的执行环境已经从栈顶被删除,
    EC(G) = {   //全局执行环境
        VO:{ //定义全局变量对象
            ... //包含全局对象原有的属性
            x = 1; //定义变量x
            A = function(){...}; //定义函数A
            A[[scope]] = this; //定义A的scope,A[[scope]] == VO(G)
        }
    }
];
로그인 후 복사

当函数B执行“x+y+z”时,需要对x、y、z 三个标识符进行一一解析,解析过程遵守变量查找规则:先查找自己的活动对象中是否存在该属性,如果存在,则停止查找并返回;如果不存在,继续沿着其作用域链从顶端依次查找,直到找到为止,如果整个作用域链上都未找到该变量,则返回“undefined”。从上面的分析可以看出函数B的作用域链是这样的:

AO(B)->AO(A)->VO(G)
로그인 후 복사

因此,变量x会在AO(A)中被找到,而不会查找VO(G)中的x,变量y也会在AO(A)中被找到,变量z 在自身的AO(B)中就找到了。所以执行结果:2+1+1=4.

简单的总结语

了解了JS引擎的工作机制之后,我们不能只停留在理解概念的层面,而要将其作为基础工具,用以优化和改善我们在实际工作中的代码,提高执行效率,产生实际价值才是我们的真正目的。就拿变量查找机制来说,如果你的代码嵌套很深,每引用一次全局变量,JS引擎就要查找整个作用域链,比如处于作用域链的最底端window和document对象就存在这个问题,因此我们围绕这个问题可以做很多性能优化的工作,当然还有其他方面的优化,此处不再赘述,本文仅当作抛砖引玉吧!

위 내용은 모든 프로그래머가 알아야 할 자바스크립트 정의부터 실행까지 상세 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 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 Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌
Will R.E.P.O. 크로스 플레이가 있습니까?
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

WebSocket과 JavaScript를 사용하여 온라인 음성 인식 시스템을 구현하는 방법 WebSocket과 JavaScript를 사용하여 온라인 음성 인식 시스템을 구현하는 방법 Dec 17, 2023 pm 02:54 PM

WebSocket 및 JavaScript를 사용하여 온라인 음성 인식 시스템을 구현하는 방법 소개: 지속적인 기술 개발로 음성 인식 기술은 인공 지능 분야의 중요한 부분이 되었습니다. WebSocket과 JavaScript를 기반으로 한 온라인 음성 인식 시스템은 낮은 대기 시간, 실시간, 크로스 플랫폼이라는 특징을 갖고 있으며 널리 사용되는 솔루션이 되었습니다. 이 기사에서는 WebSocket과 JavaScript를 사용하여 온라인 음성 인식 시스템을 구현하는 방법을 소개합니다.

WebSocket 및 JavaScript: 실시간 모니터링 시스템 구현을 위한 핵심 기술 WebSocket 및 JavaScript: 실시간 모니터링 시스템 구현을 위한 핵심 기술 Dec 17, 2023 pm 05:30 PM

WebSocket과 JavaScript: 실시간 모니터링 시스템 구현을 위한 핵심 기술 서론: 인터넷 기술의 급속한 발전과 함께 실시간 모니터링 시스템이 다양한 분야에서 널리 활용되고 있다. 실시간 모니터링을 구현하는 핵심 기술 중 하나는 WebSocket과 JavaScript의 조합입니다. 이 기사에서는 실시간 모니터링 시스템에서 WebSocket 및 JavaScript의 적용을 소개하고 코드 예제를 제공하며 구현 원칙을 자세히 설명합니다. 1. 웹소켓 기술

MySQL 복합 기본 키의 정의 및 기능 MySQL 복합 기본 키의 정의 및 기능 Mar 15, 2024 pm 05:18 PM

MySQL의 복합 기본 키는 테이블의 여러 필드로 구성된 기본 키를 말하며 각 레코드를 고유하게 식별하는 데 사용됩니다. 단일 기본 키와 달리 복합 기본 키는 여러 필드의 값을 결합하여 형성됩니다. 테이블을 생성할 때 여러 필드를 기본 키로 지정하여 복합 기본 키를 정의할 수 있습니다. 복합 기본 키의 정의와 기능을 보여주기 위해 먼저 id, 사용자 이름, 이메일이라는 세 가지 필드가 포함된 users라는 테이블을 만듭니다. 여기서 id는 자동으로 증가하는 기본 키이고 user입니다.

디스커스란 무엇인가요? Discuz의 정의 및 기능 소개 디스커스란 무엇인가요? Discuz의 정의 및 기능 소개 Mar 03, 2024 am 10:33 AM

"Discovering Discuz: 정의, 기능 및 코드 예제" 인터넷의 급속한 발전과 함께 커뮤니티 포럼은 사람들이 정보를 얻고 의견을 교환하는 중요한 플랫폼이 되었습니다. 많은 커뮤니티 포럼 시스템 중에서 중국의 잘 알려진 오픈 소스 포럼 소프트웨어인 Discuz는 대다수의 웹 사이트 개발자 및 관리자가 선호합니다. 그렇다면 Discuz는 무엇입니까? 어떤 기능이 있으며 웹사이트에 어떻게 도움이 됩니까? 이 기사에서는 Discuz를 자세히 소개하고 독자가 이에 대해 더 자세히 알아볼 수 있도록 구체적인 코드 예제를 첨부합니다.

JavaScript와 WebSocket: 효율적인 실시간 일기예보 시스템 구축 JavaScript와 WebSocket: 효율적인 실시간 일기예보 시스템 구축 Dec 17, 2023 pm 05:13 PM

JavaScript 및 WebSocket: 효율적인 실시간 일기 예보 시스템 구축 소개: 오늘날 일기 예보의 정확성은 일상 생활과 의사 결정에 매우 중요합니다. 기술이 발전함에 따라 우리는 날씨 데이터를 실시간으로 획득함으로써 보다 정확하고 신뢰할 수 있는 일기예보를 제공할 수 있습니다. 이 기사에서는 JavaScript 및 WebSocket 기술을 사용하여 효율적인 실시간 일기 예보 시스템을 구축하는 방법을 알아봅니다. 이 문서에서는 특정 코드 예제를 통해 구현 프로세스를 보여줍니다. 우리

PHP 인터페이스 소개 및 정의 방법 PHP 인터페이스 소개 및 정의 방법 Mar 23, 2024 am 09:00 AM

PHP 인터페이스 소개 및 정의 방법 PHP는 웹 개발에 널리 사용되는 오픈 소스 스크립팅 언어입니다. 유연하고 간단하며 강력합니다. PHP에서 인터페이스는 여러 클래스 간의 공통 메서드를 정의하여 다형성을 달성하고 코드를 보다 유연하고 재사용 가능하게 만드는 도구입니다. 이 기사에서는 PHP 인터페이스의 개념과 이를 정의하는 방법을 소개하고 사용법을 보여주는 특정 코드 예제를 제공합니다. 1. PHP 인터페이스 개념 인터페이스는 클래스 애플리케이션을 정의하는 객체 지향 프로그래밍에서 중요한 역할을 합니다.

간단한 JavaScript 튜토리얼: HTTP 상태 코드를 얻는 방법 간단한 JavaScript 튜토리얼: HTTP 상태 코드를 얻는 방법 Jan 05, 2024 pm 06:08 PM

JavaScript 튜토리얼: HTTP 상태 코드를 얻는 방법, 특정 코드 예제가 필요합니다. 서문: 웹 개발에서는 서버와의 데이터 상호 작용이 종종 포함됩니다. 서버와 통신할 때 반환된 HTTP 상태 코드를 가져와서 작업의 성공 여부를 확인하고 다양한 상태 코드에 따라 해당 처리를 수행해야 하는 경우가 많습니다. 이 기사에서는 JavaScript를 사용하여 HTTP 상태 코드를 얻는 방법과 몇 가지 실용적인 코드 예제를 제공합니다. XMLHttpRequest 사용

전폭 문자의 정의 및 사용 전폭 문자의 정의 및 사용 Mar 25, 2024 pm 03:33 PM

전각 문자란 무엇입니까? 컴퓨터 인코딩 시스템에서 이중 너비 문자는 두 개의 표준 문자 위치를 차지하는 문자 인코딩 방법입니다. 이에 표준 문자 위치를 차지하는 문자 인코딩 방식을 반각문자라 한다. 전자 문자는 일반적으로 중국어, 일본어, 한국어 및 기타 아시아 문자의 입력, 표시 및 인쇄에 사용됩니다. 중국어 입력 방법과 텍스트 편집에서는 전자와 반각 문자의 사용 시나리오가 다릅니다. 전각문자 사용 중국어 입력방법 : 중국어 입력방법에서는 한자, 기호 등의 한자를 입력할 때 일반적으로 전각문자를 사용한다.

See all articles