JavaScript의 정의부터 실행까지 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입니다. 아래에서는 JS를 전역 초기화, 함수 A 실행, 실행의 세 단계로 분석해 보겠습니다. 함수 B. 엔진의 작동 메커니즘:
1. 전역 초기화
JS 엔진이 실행 가능한 코드를 입력하면 다음을 완료해야 합니다. 세 가지 초기화 작업:
먼저 전역 개체(Global Object)를 만듭니다. 이 개체의 복사본은 전역적으로 어디에서나 액세스할 수 있으며 해당 개체의 존재는 개체의 전체 수명 주기를 수반합니다. 애플리케이션. 전역 객체 생성 시 Math, String, Date, document 등 일반적으로 사용되는 JS 객체를 속성으로 사용합니다. 이 전역 객체는 이름으로 직접 접근할 수 없기 때문에 또 다른 속성 윈도우가 있고, 윈도우가 자신을 가리키므로 윈도우를 통해 전역 객체에 접근할 수 있다. 의사 코드로 시뮬레이션된 전역 개체의 일반적인 구조는 다음과 같습니다.
//创建一个全局对象 var globalObject = { Math:{}, String:{}, Date:{}, document:{}, //DOM操作 ... window:this //让window属性指向了自身 }
그런 다음 JS 엔진은 실행 환경 스택(Execution Context Stack)을 구축해야 합니다. 동시에 전역 실행 환경(Execution Context) 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를 정의할 때 An도 추가합니다. 범위를 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://链表初始化为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) } } ];
三、 执行函数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://链表初始化为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对象就存在这个问题,因此我们围绕这个问题可以做很多性能优化的工作,当然还有其他方面的优化,此处不再赘述,本文仅当作抛砖引玉吧!
以上就是本文的全部内容,希望对大家的学习有所帮助。
【相关教程推荐】
1. JavaScript视频教程
2. JavaScript在线手册
3. bootstrap教程

실제 세계에서 JavaScript의 응용 프로그램에는 프론트 엔드 및 백엔드 개발이 포함됩니다. 1) DOM 운영 및 이벤트 처리와 관련된 TODO 목록 응용 프로그램을 구축하여 프론트 엔드 애플리케이션을 표시합니다. 2) Node.js를 통해 RESTFULAPI를 구축하고 Express를 통해 백엔드 응용 프로그램을 시연하십시오.

웹 개발에서 JavaScript의 주요 용도에는 클라이언트 상호 작용, 양식 검증 및 비동기 통신이 포함됩니다. 1) DOM 운영을 통한 동적 컨텐츠 업데이트 및 사용자 상호 작용; 2) 사용자가 사용자 경험을 향상시키기 위해 데이터를 제출하기 전에 클라이언트 확인이 수행됩니다. 3) 서버와의 진실한 통신은 Ajax 기술을 통해 달성됩니다.

보다 효율적인 코드를 작성하고 성능 병목 현상 및 최적화 전략을 이해하는 데 도움이되기 때문에 JavaScript 엔진이 내부적으로 작동하는 방식을 이해하는 것은 개발자에게 중요합니다. 1) 엔진의 워크 플로에는 구문 분석, 컴파일 및 실행; 2) 실행 프로세스 중에 엔진은 인라인 캐시 및 숨겨진 클래스와 같은 동적 최적화를 수행합니다. 3) 모범 사례에는 글로벌 변수를 피하고 루프 최적화, Const 및 Lets 사용 및 과도한 폐쇄 사용을 피하는 것이 포함됩니다.

Python은 부드러운 학습 곡선과 간결한 구문으로 초보자에게 더 적합합니다. JavaScript는 가파른 학습 곡선과 유연한 구문으로 프론트 엔드 개발에 적합합니다. 1. Python Syntax는 직관적이며 데이터 과학 및 백엔드 개발에 적합합니다. 2. JavaScript는 유연하며 프론트 엔드 및 서버 측 프로그래밍에서 널리 사용됩니다.

Python과 JavaScript는 커뮤니티, 라이브러리 및 리소스 측면에서 고유 한 장점과 단점이 있습니다. 1) Python 커뮤니티는 친절하고 초보자에게 적합하지만 프론트 엔드 개발 리소스는 JavaScript만큼 풍부하지 않습니다. 2) Python은 데이터 과학 및 기계 학습 라이브러리에서 강력하며 JavaScript는 프론트 엔드 개발 라이브러리 및 프레임 워크에서 더 좋습니다. 3) 둘 다 풍부한 학습 리소스를 가지고 있지만 Python은 공식 문서로 시작하는 데 적합하지만 JavaScript는 MDNWebDocs에서 더 좋습니다. 선택은 프로젝트 요구와 개인적인 이익을 기반으로해야합니다.

C/C에서 JavaScript로 전환하려면 동적 타이핑, 쓰레기 수집 및 비동기 프로그래밍으로 적응해야합니다. 1) C/C는 수동 메모리 관리가 필요한 정적으로 입력 한 언어이며 JavaScript는 동적으로 입력하고 쓰레기 수집이 자동으로 처리됩니다. 2) C/C를 기계 코드로 컴파일 해야하는 반면 JavaScript는 해석 된 언어입니다. 3) JavaScript는 폐쇄, 프로토 타입 체인 및 약속과 같은 개념을 소개하여 유연성과 비동기 프로그래밍 기능을 향상시킵니다.

각각의 엔진의 구현 원리 및 최적화 전략이 다르기 때문에 JavaScript 엔진은 JavaScript 코드를 구문 분석하고 실행할 때 다른 영향을 미칩니다. 1. 어휘 분석 : 소스 코드를 어휘 단위로 변환합니다. 2. 문법 분석 : 추상 구문 트리를 생성합니다. 3. 최적화 및 컴파일 : JIT 컴파일러를 통해 기계 코드를 생성합니다. 4. 실행 : 기계 코드를 실행하십시오. V8 엔진은 즉각적인 컴파일 및 숨겨진 클래스를 통해 최적화하여 Spidermonkey는 유형 추론 시스템을 사용하여 동일한 코드에서 성능이 다른 성능을 제공합니다.

실제 세계에서 JavaScript의 응용 프로그램에는 서버 측 프로그래밍, 모바일 애플리케이션 개발 및 사물 인터넷 제어가 포함됩니다. 1. 서버 측 프로그래밍은 Node.js를 통해 실현되며 동시 요청 처리에 적합합니다. 2. 모바일 애플리케이션 개발은 재교육을 통해 수행되며 크로스 플랫폼 배포를 지원합니다. 3. Johnny-Five 라이브러리를 통한 IoT 장치 제어에 사용되며 하드웨어 상호 작용에 적합합니다.


핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

MinGW - Windows용 미니멀리스트 GNU
이 프로젝트는 osdn.net/projects/mingw로 마이그레이션되는 중입니다. 계속해서 그곳에서 우리를 팔로우할 수 있습니다. MinGW: GCC(GNU Compiler Collection)의 기본 Windows 포트로, 기본 Windows 애플리케이션을 구축하기 위한 무료 배포 가능 가져오기 라이브러리 및 헤더 파일로 C99 기능을 지원하는 MSVC 런타임에 대한 확장이 포함되어 있습니다. 모든 MinGW 소프트웨어는 64비트 Windows 플랫폼에서 실행될 수 있습니다.

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

에디트플러스 중국어 크랙 버전
작은 크기, 구문 강조, 코드 프롬프트 기능을 지원하지 않음

Atom Editor Mac 버전 다운로드
가장 인기 있는 오픈 소스 편집기

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경
