Home > Web Front-end > JS Tutorial > A brief discussion on scope and closure issues in JavaScript_Basic knowledge

A brief discussion on scope and closure issues in JavaScript_Basic knowledge

WBOY
Release: 2016-05-16 15:51:19
Original
1010 people have browsed it

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 internal local variables cannot be accessed outside the function:

function test() {
var a = 0; // 局部变量
b = 1; // 全局变量
}
a = ?, b = ? // a为undefined,b为1
Copy after login

Local variables with the same name will override global variables, but essentially they are two independent variables. Changes in one will not affect the other:

a = 5; // 函数外a的值为5
function test() {
var a = 4; // 函数内a的值为4
}();
a = ? // 函数外a的值仍为5,不受函数影响
Copy after login

Generally speaking, after the function ends, all references to the internal variables of the function end, the local variables within the function 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(); // 返回值为64, 内部变量b为63
a(); // 返回值为63, 内部变量b为62
Copy after login

When an internal function is used as the return value, because the reference to the internal variable does not end after the function ends, the local variables of the function cannot be recycled, and the execution environment of the function is retained, thus forming a closure effect, which can be passed Reference access to internal variables that should be recycled.
Closure also makes the local variables of the function "private" variables, which can only be accessed through the returned inner function and cannot be changed by any other means.
Therefore, closures can be used to maintain local variables and protect variables.
Without closure:

var a = []; // 假设a中包含5个元素
for (var i = 0, m = a.length; i < m; i++) {
a[i].onclick = function(e) {
return 'No. ' + i;
};
}
// 点击任何一个元素,返回值都是“No. 5”,因为i最后的值为5
使用闭包的情况:
function test(i) {
return function(e) {
return 'No. ' + i;
};
}
var a = []; // 假设a中包含5个元素
for (var i = 0, m = a.length; i < m; i++) {
a[i].onclick = test(i);
}
// 使用闭包维持局部变量,点击元素返回No. 0 ~ No. 4
Copy after login

While closures bring convenience, they also bring some disadvantages:
1. The complexity of the program increases and it becomes more difficult to understand
2. Interfering with normal garbage collection, complex closures may also cause memory to fail to be recycled and crash
3. Huge closures are often accompanied by performance problems
Therefore, closures should be compact and compact, rather than large and complex, and large-scale use of closures should be avoided. 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.

Related labels:
source:php.cn
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
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template