Table of Contents
Thinking Questions
Specific execution analysis
Summary
Home Web Front-end JS Tutorial An article to talk about execution context in Javascript

An article to talk about execution context in Javascript

Feb 14, 2023 pm 07:41 PM
javascript execution context

This article will talk about the execution context in Javascript and share a thinking question. Through the analysis of the thinking question, you will surely have a deeper understanding of the execution context.

An article to talk about execution context in Javascript

In the previous articles, we have an in-depth understanding of the three important members of the execution context: variable objects, scope chains, and this. This article is the first The collection of the contents of the four articles aggregates scattered knowledge points and makes a simple consolidation. I don’t know if anyone came here from the previous article. Our last article left a question. Through the analysis of the question, I will have a deeper understanding of the execution context.

Thinking Questions

In order to slightly complicate the case, a few modifications have been made, but the points examined in the original question have not been changed.

function func(value){
    getValue = function(){
        console.log(value);
    };
    return this
}
            
function getValue(){
    console.log(5);
}

Func(1).getValue(); //为什么是1呢?
Copy after login

Specific execution analysis

Execute global code, create a global execution context, and the global context is pushed into the execution context stack

ECStack = [ globalContext ];
Copy after login
Copy after login

Initialize the global context

globalContext = {
    VO: {
        func: reference to function func(){},
        getValue: reference to function getValue(){}
    },
    Scope: [globalContext.VO],
    this: globalContext.VO //全局上下文
}
Copy after login

Initializing the global context creates two functions at the same time, so their parent scope chains will also be saved in their internal properties [[scope]]

func.[[scope]] = [
     globalContext.VO
];
getValue.[[scope]] = [
     globalContext.VO
];
Copy after login

At this time, code execution begins, When the last statement is executed, the func function is executed first, which creates a step-by-step func function execution context:

  • Copy function [[scope]] attribute to create a scope chain

  • Create the active object with arguments

  • Initialize the active object

  • Push the active object into the top of the checksfunccope scope chain.

  • Create this, simple analysis: MemberExpression value is func, func is a function object, of course a Reference, where its base value is EnvironmentRecord, so its this value is ImplicitThisValue( ref), the return value is always undefined. In non-strict mode, its value will be implicitly converted to a global object.

funcContext = {
    AO: {
        arguments: { // 数组
            0: 1,
            length: 1
        }
    },
    Scope: [AO, globalContext.VO],
    this: undefined
}
Copy after login

Some people may have questions, what about getValue in func? , because it does not have a variable declaration, so it is actually an attribute assignment operation, which will be executed later at runtime.

Create the function execution context and push it into the execution context stack

    ECStack = [
        funcContext,
        globalContext
    ];
Copy after login

The function starts executing. This is the key to why the final output is 1, the first sentence assignment operation , then you need to find the variable getValue along the execution context, then let's look at the scope in funcContext. First find funcContext.AO. Obviously the attribute getValue does not exist, then look up along the scope chain and find it. globalContext.VO, getValue is found. At this time, the getValue attribute in the global scope will be reassigned. What is assigned is a new version of the function, and the function scope is re-created, and the parent of this new getValue function is re-assigned. Level scope chains are stored in their internal properties [[scope]]:

getValue .[[scope]] = [ funcContext.AO, globalContext.VO ];
Copy after login

Then continue to return this and find this of funcContext, that is, return undefined; func execution context pops

ECStack = [ globalContext ];
Copy after login
Copy after login

Continue executionFunc(1).getValue(), the first half returns undefined. At this time, the system implicitly converts to a global variable object and finds the getValue attribute from the global variable object. At this time, we found that getValue was no longer the boy it was back then. The function execution context of the new getValue was pushed onto the stack:

getValueContext = {
    AO: {
        arguments: { // 数组
            length: 0
        }
    },
    Scope: [ AO, funcContext.AO, globalContext.VO ],
    this: undefined
} ECStack = [
    getValueContext,
    globalContext
 ];
Copy after login

function started to execute and found that she wanted to output value, along the scope Go look for it. There is no such attribute in getValueContext.AO. Continue to search and find funcContext.AO (Attention!). If you find the value in the formal parameter, then the corresponding value will be output. 1.

After the function is executed, getValueContext and globalContext are popped off the stack and destroyed one after another, and the code is completed.

Summary

This film uses a simple but not simple example to connect the previous four articles and completely analyze the execution context when JS code is executed. I hope everyone can have a deeper understanding of this work process. However, I wonder if any attentive students have discovered that in the above example, during the execution of the getValue function, from the step of finding the attribute value (marking the position), at that time the func function has obviously been executed, and its execution context has been released. stack, why can we still find the value attribute from its execution context? This is actually the principle of closure generation. In the next article, we will still use this example to learn the principle of closure generation.

[Recommended learning: javascript advanced tutorial]

The above is the detailed content of An article to talk about execution context in Javascript. For more information, please follow other related articles on the PHP Chinese website!

Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

Video Face Swap

Video Face Swap

Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Roblox: Bubble Gum Simulator Infinity - How To Get And Use Royal Keys
3 weeks ago By 尊渡假赌尊渡假赌尊渡假赌
Nordhold: Fusion System, Explained
3 weeks ago By 尊渡假赌尊渡假赌尊渡假赌
Mandragora: Whispers Of The Witch Tree - How To Unlock The Grappling Hook
3 weeks ago By 尊渡假赌尊渡假赌尊渡假赌

Hot Tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

Hot Topics

Java Tutorial
1667
14
PHP Tutorial
1273
29
C# Tutorial
1255
24
How to implement an online speech recognition system using WebSocket and JavaScript How to implement an online speech recognition system using WebSocket and JavaScript Dec 17, 2023 pm 02:54 PM

How to use WebSocket and JavaScript to implement an online speech recognition system Introduction: With the continuous development of technology, speech recognition technology has become an important part of the field of artificial intelligence. The online speech recognition system based on WebSocket and JavaScript has the characteristics of low latency, real-time and cross-platform, and has become a widely used solution. This article will introduce how to use WebSocket and JavaScript to implement an online speech recognition system.

WebSocket and JavaScript: key technologies for implementing real-time monitoring systems WebSocket and JavaScript: key technologies for implementing real-time monitoring systems Dec 17, 2023 pm 05:30 PM

WebSocket and JavaScript: Key technologies for realizing real-time monitoring systems Introduction: With the rapid development of Internet technology, real-time monitoring systems have been widely used in various fields. One of the key technologies to achieve real-time monitoring is the combination of WebSocket and JavaScript. This article will introduce the application of WebSocket and JavaScript in real-time monitoring systems, give code examples, and explain their implementation principles in detail. 1. WebSocket technology

How to use JavaScript and WebSocket to implement a real-time online ordering system How to use JavaScript and WebSocket to implement a real-time online ordering system Dec 17, 2023 pm 12:09 PM

Introduction to how to use JavaScript and WebSocket to implement a real-time online ordering system: With the popularity of the Internet and the advancement of technology, more and more restaurants have begun to provide online ordering services. In order to implement a real-time online ordering system, we can use JavaScript and WebSocket technology. WebSocket is a full-duplex communication protocol based on the TCP protocol, which can realize real-time two-way communication between the client and the server. In the real-time online ordering system, when the user selects dishes and places an order

How to implement an online reservation system using WebSocket and JavaScript How to implement an online reservation system using WebSocket and JavaScript Dec 17, 2023 am 09:39 AM

How to use WebSocket and JavaScript to implement an online reservation system. In today's digital era, more and more businesses and services need to provide online reservation functions. It is crucial to implement an efficient and real-time online reservation system. This article will introduce how to use WebSocket and JavaScript to implement an online reservation system, and provide specific code examples. 1. What is WebSocket? WebSocket is a full-duplex method on a single TCP connection.

JavaScript and WebSocket: Building an efficient real-time weather forecasting system JavaScript and WebSocket: Building an efficient real-time weather forecasting system Dec 17, 2023 pm 05:13 PM

JavaScript and WebSocket: Building an efficient real-time weather forecast system Introduction: Today, the accuracy of weather forecasts is of great significance to daily life and decision-making. As technology develops, we can provide more accurate and reliable weather forecasts by obtaining weather data in real time. In this article, we will learn how to use JavaScript and WebSocket technology to build an efficient real-time weather forecast system. This article will demonstrate the implementation process through specific code examples. We

Simple JavaScript Tutorial: How to Get HTTP Status Code Simple JavaScript Tutorial: How to Get HTTP Status Code Jan 05, 2024 pm 06:08 PM

JavaScript tutorial: How to get HTTP status code, specific code examples are required. Preface: In web development, data interaction with the server is often involved. When communicating with the server, we often need to obtain the returned HTTP status code to determine whether the operation is successful, and perform corresponding processing based on different status codes. This article will teach you how to use JavaScript to obtain HTTP status codes and provide some practical code examples. Using XMLHttpRequest

How to use insertBefore in javascript How to use insertBefore in javascript Nov 24, 2023 am 11:56 AM

Usage: In JavaScript, the insertBefore() method is used to insert a new node in the DOM tree. This method requires two parameters: the new node to be inserted and the reference node (that is, the node where the new node will be inserted).

JavaScript and WebSocket: Building an efficient real-time image processing system JavaScript and WebSocket: Building an efficient real-time image processing system Dec 17, 2023 am 08:41 AM

JavaScript is a programming language widely used in web development, while WebSocket is a network protocol used for real-time communication. Combining the powerful functions of the two, we can create an efficient real-time image processing system. This article will introduce how to implement this system using JavaScript and WebSocket, and provide specific code examples. First, we need to clarify the requirements and goals of the real-time image processing system. Suppose we have a camera device that can collect real-time image data

See all articles