Analysis and explanation of JavaScript scope and closure
[Introduction] The scope of JavaScript is bounded by functions, and different functions have relatively independent scopes. Global variables can be declared and accessed inside the function, and local variables can also be declared (using the var keyword, the parameters of the function are also local variables), but the internal local variables cannot be accessed outside the function: functio
function test() {
var a = 0; // Local variable
b = 1; // Global variable
}
a = ?, b = ? // a is undefined, b is 1
Local variables with the same name will overwrite global variables, but essentially they are two independent variables, and changes to one of them will not Affects the other party:
a = 5; // The value of a outside the function is 5
function test() {
var a = 4; // The value of a inside the function is 4
}();
a = ? //The value of a outside the function is still 5 and is not affected by the function
Generally speaking, after the function ends, all references to the internal variables of the function end, and the function The local variables inside will be recycled and the execution environment of the function will be cleared. However, if the internal function is used as the return result of the function, the situation will change:
function test(i) {
var b = i * i;
return function() {
return b--;
};
}
var a = test(8);
a(); / / The return value is 64, the internal variable b is 63
a(); // The return value is 63, the internal variable b is 62
When the internal function is used as the return value, because after the function ends The reference of the variable has not ended, so the local variables of the function cannot be recycled, and the execution environment of the function is retained, thus forming a closure effect. Internal variables that should be recycled can be accessed through this reference.
Closure also makes the local variables of the function "private" variables, which can only be accessed through the returned internal function and cannot be changed by any other means.
Therefore, closures can be used to maintain local variables and protect variables.
Situation without closure:
var a = []; // Assume a contains 5 elements
for (var i = 0, m = a.length; i < m; i++) {
a[i].onclick = function(e) {
return 'No. ' + i;
};
}
// Click on any For an element, the return value is "No. 5", because the final value of i is 5
Using closure:
function test(i) {
return function(e) {
return 'No. ' + i;
};
}
var a = []; // Assume a contains 5 elements
for (var i = 0, m = a.length; i < m; i++) {
a[i].onclick = test(i);
}
// Use closures to maintain local variables, click The element returns No. 0 ~ No. 4
While closure brings convenience, it also brings some disadvantages:
1. The complexity of the program increases, making it more difficult to understand.
2. Interference with normal operation Garbage collection, complex closures may also lead to memory failure and crash
3. Huge closures are often accompanied by performance problems
Therefore, closures should be streamlined and small, rather than large and complex, and large and complex closures should be avoided. Scale using closures. The emergence of closures is itself a bug in the language, but it remains because of its unique functions. It is a supplementary means, not the main function.
The above is the detailed content of Analysis and explanation of JavaScript scope and closure. For more information, please follow other related articles on the PHP Chinese website!

Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

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

Hot Article

Hot Tools

Notepad++7.3.1
Easy-to-use and free code editor

SublimeText3 Chinese version
Chinese version, very easy to use

Zend Studio 13.0.1
Powerful PHP integrated development environment

Dreamweaver CS6
Visual web development tools

SublimeText3 Mac version
God-level code editing software (SublimeText3)

Hot Topics

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.

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 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.

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.

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. 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.

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.

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.
