Table of Contents
Code optimization
Home Web Front-end JS Tutorial JavaScript scope chain and execution environment

JavaScript scope chain and execution environment

Mar 26, 2017 pm 04:49 PM

The concepts of scope, scope chain, execution environment, execution environment stack and this are very important in JavaScript. I often confuse them, so here is a summary;

  1. ## The area inside the local scope function, the global scope is window;

  2. The scope chain depends on the position when the function is declared. When parsing the identifier, the current scope is first found. Then search outwards until the whole world, such an order; it has nothing to do with where the function is called;

  3. The execution environment is the collection of data and variables accessible to the function, which is the scope of the function All data and variables on the chain;

  4. The execution environment stack is based on the order of code execution. Each execution environment is accessed layer by layer in the form of a stack, and exits and throws away when used up; if the current If the execution environment (which stores data and variables in the current scope chain) cannot find the variable, it means it cannot be found. It will not search in the previous execution environment. It is different from the scope chain;

Scope

JavaScript has no concept of block-level scope, only function-level scope: variables are visible within the body of the function in which they are declared and its subfunctions.

Scope is the accessible scope of variables and functions, which controls the visibility and life cycle of variables and functions. In JavaScript, the scope of variables has global scope and local scope.

  • If a variable is not declared within a function or declared without var, it is a global variable and has a global scope;

  •         <script type="text/javascript">
                function test1(){
                    a = 1;//全局变量,只有在当前函数运行时,才有效            }
                test1();
                console.log(a);//1       注意test1函数必须运行,不然找不到a
            </script>
    Copy after login
  • Global variables can be used as properties of the window object, they are the same;

  •         <script type="text/javascript">    
                var b = 1;//全局变量            
                console.log(b === window.b);
                //true  全局变量可以当做window对象的属性用,他们是一样的;
            </script>
    Copy after login
  • All properties of the window object have global scope and can be used anywhere in the code It can be accessed anywhere;

  • The variables declared inside the function are local variables and can only be used within the function body. Although the parameters of the function do not use var, they are still local variables.

  •         <script type="text/javascript">    
                var c = 1;//全局变量//            
                console.log(d);//ReferenceError: d is not defined    引用错误,当前作用域就是最外层作用域,依然找不到d
                function test2(d){
                    console.log(c);
                    //1   全局变量,哪都可以访问;(先找当前作用域,找不到,就向外层作用域找,直到window最外层,找到了)                console.log(d);//3   形参是局部变量,只有当前作用域下可以访问            }
                test2(3);        
                </script>
    Copy after login
Scope chain

The scope chain depends on the position when the function is declared. When parsing the identifier, it starts from the current scope. When it cannot be found in the scope, the engine will continue to search in the outer nested scope until it finds the variable or reaches the outermost scope (that is, the global scope);

Its route has been It is fixed and has nothing to do with where the function runs;

        <script type="text/javascript">
            var a = 1;            
            var b = 2;            
            var c = 3;            
            var d = 4;            
            function inner(d) {//它的作用域链是inner---全局
                var c = 8;
                
                console.log(a);//1  当前作用域找不到a,去全局作用域找到了a=1                console.log(b);//2  当前作用域找不到b,去全局作用域找到了b=2                console.log(c);//8  当前作用域找到了c=8                console.log(d);//7  当前作用域找到了d=7,形参也是局部作用域
            //    console.log(e);//ReferenceError: e is not defined   引用错误,找不到e, 它的作用域链是inner---全局                console.log(a+b+c+d);//18            }            function outter(e) {                var a = 5;//inner()的作用域链是inner---全局,所以这个a相当于无效
                var b = 6;//inner()的作用域链是inner---全局,所以这个a相当于无效                inner(7);
            }
            outter(999);//这个999无效,里面的e根本找不到
        </script>
Copy after login

  • Identifiers with the same name can be defined in multi-level nested scopes, which is called the "shadowing effect" ", the internal identifier "shields" the external identifier

  • Through the window.a technology, you can access global variables that are shaded by variables of the same name. But if non-global variables are obscured, they cannot be accessed anyway;

  •         <script type="text/javascript">
                var a = &#39;Lily&#39;;            
                var b = &#39;Lucy&#39;;            
                function outer() {                
                var b = &#39;Jesica&#39;;                
                var c = &#39;Susan&#39;;                
                function inner(c) {
                    console.log(a);//Lily                      
                    console.log(window.b);//Lucy                    
                    console.log(b);//Jesica                    
                    console.log(c);//Jenifer                
                    }
                inner(&#39;Jenifer&#39;);
              }
                outer();       
             </script>
    Copy after login
Execution environment

Execution context (execution context), also called execution context . Each execution environment has a variable object (variable

object) that saves all variables and data accessible to the function (that is, all data and variables on the function's scope chain). Our code cannot access it, it is used by the engine;

Execution environment stack. When execution enters a function, the execution environment of the function will be pushed into a stack. After the function is executed, the stack removes its execution environment, the variables and data inside it will be marked and cleared, waits for garbage collection, and then returns control to the previous execution environment. The execution in the javascript program is controlled by this mechanism;

 

It should be noted that if the current execution environment (which stores data and variables in the current scope chain) cannot find the variable, it is When it’s not there, it won’t search the previous execution environment, which is different from the scope chain

The execution order of the code is not all line by line, but the calling order of the function Related:

  • The code enters the global execution environment, and the global execution environment is put into the environment stack;

  • When a function is executed, this The execution environment of the function is pushed to the top of the environment stack, followed by the previous execution environment;

  • The global execution environment is entered first, so it is always at the bottom; it is similar to the concept of a stack;

  • After the function is executed, its execution environment is removed from the top of the scope chain. The data and functions it saves are marked and cleared, waiting for garbage collection;

  • Control is handed over to the previous execution environment and execution continues;

  • The global execution environment is destroyed when the page is closed;

  • Code execution enters the global execution environment, and the code in the global execution environment enters statement promotion;

  • Execute line 2, assign a=1; and then line 2 Line 3 assigns b=2; then line 4 assigns c=3; then line 5 assigns d=4;

  • Execute line 20, call the outer(999) function, then enter the outer(999) function execution environment, declare promotion, and pass the actual parameter 999 to the formal parameter e; now there are Two execution environments, outer(999) is the current execution environment;

  • Execute line 16, assign a=5; and then assign b=6 on line 17;

  • Execute line 18, call the inner(7) function, then enter the inner(7) function execution environment, declare promotion, and pass the actual parameter 7 to the formal parameter d;

  • Execute line 7, assign c=8; then calculate and output;

Code optimization

Since it is necessary to find variables on the scope chain To consume performance, we should find variables as soon as possible, so when functions are nested in multiple layers, we should use local variables inside the function as much as possible;

We can say that using global variables inside the function is a A cross-scope operation. If a cross-scope value is used multiple times inside the function, then we store it in a local variable, which can improve performance.

The above is the detailed content of JavaScript scope chain and execution environment. 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 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)

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.

There are several situations where this in js points to There are several situations where this in js points to May 06, 2024 pm 02:03 PM

In JavaScript, the pointing types of this include: 1. Global object; 2. Function call; 3. Constructor call; 4. Event handler; 5. Arrow function (inheriting outer this). Additionally, you can explicitly set what this points to using the bind(), call(), and apply() methods.

See all articles