Home Web Front-end JS Tutorial In-depth understanding of scope and context in Javascript_javascript skills

In-depth understanding of scope and context in Javascript_javascript skills

May 16, 2016 pm 03:51 PM
javascript context Scope

Overview

The implementation of scope and context in Javascript is a unique feature of the Javascript language. To a certain extent, the Javascript language is very flexible. Functions in Javascript can take on a variety of contexts, and scopes can be encapsulated and saved. It is precisely because of these characteristics that Javascript also provides many useful design patterns. However, scope and context are also areas where Javascript programmers often get confused during development.
The following will introduce to you the concepts of scope and context in Javascript, as well as their differences.

Scope VS Context

The first important thing to note is that scope and context are not the same concepts, and they do not refer to the same thing. As a front-end geek, I often see articles that confuse these two concepts. As a result, some things become less clear the more I read them. These two concepts seem to have been confused for a long time. Therefore, I checked a lot of information and briefly explained these two concepts. :stuck_out_tongue_closed_eyes:
In Javascript, when a function is called, there is a scope and context bound to the function. Fundamentally, scope is function-based and context is object-based. In other words, scope applies to access to variables within a function when the function is called. Context usually refers to the value of the "this" keyword, which is a reference to the object that owns the currently executing code.

Variable scope

Variables can be defined in the local or global scope, called local variables and global variables respectively. Global variables refer to variables declared outside the function. Global variables can be accessed anywhere in the program. Local variables refer to variables defined within the function body. They can only be accessed within the function body or nested functions, and cannot be accessed outside the function.
Javascript currently does not support block-level scope (variables defined in if, switch, for, etc. statements). This means that variables defined inside a block can also be accessed outside the block. However, in ES6, we can define block-level scope using the "let" keyword.
Regarding the content of the scope, you can check other information. This part of the content is relatively simple.

"this" context

Context usually depends on how the function is called. When a function is called as a method on an object, "this" refers to the object on which the function was called.

Copy code The code is as follows:

var obj={
foo:function (){
console.log(this === obj);
}
};
obj.foo(); //Output true

Similarly, when we use the "new" keyword to create a new object, this refers to the newly created object.
Copy code The code is as follows:

function foo(){
console.log(this);
}
foo(); //Output window
var obj=new foo(); //Output foo {}

One thing to note is that when a function in the global scope is called, this refers to the global object, which in the browser environment refers to window. However, when running the code in strict mode, "this" is set to "undefined"
Execution Context

Javascript is a single-threaded language, which means that when Javascript is running in the browser, it can only do one thing at a time, and other things will be queued in the method, waiting to be processed.

1. When the Javascript code file is loaded by the browser, the latest entry is a global execution context by default. When a function is called in the global context, the program enters the called function, and the Javascript engine creates a new execution context for the function and pushes it to the top of the execution context stack. The browser always executes the context currently at the top of the stack. Once execution is complete, the context is popped from the top of the stack and then executes code in the context below it. In this way, the contexts in the stack will be executed sequentially and popped off the stack until returning to the global context.

2. An execution context can be divided into two phases: creation phase and execution phase. In the creation phase, the JavaScript interpreter first creates a variable object (also called an "activation object"). Active objects consist of variables, function declarations and parameters. At this stage, the function's scope chain is initialized and the object referenced by this is also determined. Next comes the execution phase, where the code is interpreted and executed.
In Javascript code, there can be any number of function contexts. We already know that when a function is called, the Javascript interpreter will create a new context and a private scope. Any variables declared inside the function will be It cannot be accessed directly outside the scope of the current function.

3. Through the above explanation, we have a basic concept of the "execution context" of the function, but this is also the place where everyone is most confused. The "execution context" in Javascript mainly refers to the scope, not the "this context" referred to in the fourth section above. There are many similar confusing concepts in Javascript, but as long as we understand the specific object that each concept refers to, we will no longer be confused. Therefore, I also hope that everyone can truly distinguish "execution context". and "this context".

In a simple sentence, execution context is a concept related to scope, although this may not be rigorous.

Scope chain

For each execution context, there is a scope bound to it. The scope chain contains the execution context activation object (which sounds a bit convoluted) in the execution context stack. The scope chain determines access to variables and resolution of identifiers.

Code example:

Copy code The code is as follows:

function first(){
Second();
Function second(){
        third();
         function third(){
            fourth();
             function fourth(){
//Code
            }
}
}
}
first();

Execute the above code, and the nested functions will be executed. As far as the above code is concerned, a scope chain will also be formed. The order of the scope chain from top to bottom is: fourth, third, second, first, global. Function fourth can access variables in the global scope and can access any variables defined in functions third, second, and first.
One thing to note is that within the function body, local variables have higher priority than global variables with the same name. If a local variable declared within a function or a variable contained in a function parameter has the same name as a global variable, the global variable will be overwritten by the local variable.
To put it simply, every time we try to access a variable, the program will search for the variable in the scope of the current function. If it cannot be found, it will search along the scope chain to the upper level of the function until the variable is found. If it cannot be found, Returns undefined.

Summary

This article introduces the related concepts of context and scope in javascript. There are also several more important concepts in javascript, such as closures, etc. If you understand these in the future, you will write an article~~

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 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
1664
14
PHP Tutorial
1268
29
C# Tutorial
1246
24
Usage of typedef struct in c language Usage of typedef struct in c language May 09, 2024 am 10:15 AM

typedef struct is used in C language to create structure type aliases to simplify the use of structures. It aliases a new data type to an existing structure by specifying the structure alias. Benefits include enhanced readability, code reuse, and type checking. Note: The structure must be defined before using an alias. The alias must be unique in the program and only valid within the scope in which it is declared.

How to solve variable expected in java How to solve variable expected in java May 07, 2024 am 02:48 AM

Variable expected value exceptions in Java can be solved by: initializing variables; using default values; using null values; using checks and assignments; and knowing the scope of local variables.

Advantages and disadvantages of closures in js Advantages and disadvantages of closures in js May 10, 2024 am 04:39 AM

Advantages of JavaScript closures include maintaining variable scope, enabling modular code, deferred execution, and event handling; disadvantages include memory leaks, increased complexity, performance overhead, and scope chain effects.

What does include mean in c++ What does include mean in c++ May 09, 2024 am 01:45 AM

The #include preprocessor directive in C++ inserts the contents of an external source file into the current source file, copying its contents to the corresponding location in the current source file. Mainly used to include header files that contain declarations needed in the code, such as #include <iostream> to include standard input/output functions.

C++ smart pointers: a comprehensive analysis of their life cycle C++ smart pointers: a comprehensive analysis of their life cycle May 09, 2024 am 11:06 AM

Life cycle of C++ smart pointers: Creation: Smart pointers are created when memory is allocated. Ownership transfer: Transfer ownership through a move operation. Release: Memory is released when a smart pointer goes out of scope or is explicitly released. Object destruction: When the pointed object is destroyed, the smart pointer becomes an invalid pointer.

Can the definition and call of functions in C++ be nested? Can the definition and call of functions in C++ be nested? May 06, 2024 pm 06:36 PM

Can. C++ allows nested function definitions and calls. External functions can define built-in functions, and internal functions can be called directly within the scope. Nested functions enhance encapsulation, reusability, and scope control. However, internal functions cannot directly access local variables of external functions, and the return value type must be consistent with the external function declaration. Internal functions cannot be self-recursive.

The difference between let and var in vue The difference between let and var in vue May 08, 2024 pm 04:21 PM

In Vue, there is a difference in scope when declaring variables between let and var: Scope: var has global scope and let has block-level scope. Block-level scope: var does not create a block-level scope, let creates a block-level scope. Redeclaration: var allows redeclaration of variables in the same scope, let does not.

C++ Smart Pointers: From Basics to Advanced C++ Smart Pointers: From Basics to Advanced May 09, 2024 pm 09:27 PM

Smart pointers are C++-specific pointers that can automatically release heap memory objects and avoid memory errors. Types include: unique_ptr: exclusive ownership, pointing to a single object. shared_ptr: shared ownership, allowing multiple pointers to manage objects at the same time. weak_ptr: Weak reference, does not increase the reference count and avoid circular references. Usage: Use make_unique, make_shared and make_weak of the std namespace to create smart pointers. Smart pointers automatically release object memory when the scope ends. Advanced usage: You can use custom deleters to control how objects are released. Smart pointers can effectively manage dynamic arrays and prevent memory leaks.

See all articles