作用域是指变量和函数的可访问范围,JavaScript中有以下几种作用域:
闭包是指有权访问另一个函数作用域中的变量的函数。简单说就是函数内部定义的函数,可以访问外部函数的变量。
for (var i = 0; i < 5; i++) {
setTimeout(function() {
console.log(i); // 总是输出5
}, 1000);
}
原因:所有定时器回调共享同一个i变量,循环结束后i的值为5
解决方案:
for (var i = 0; i < 5; i++) {
(function(j) {
setTimeout(function() {
console.log(j);
}, 1000);
})(i);
}
for (let i = 0; i < 5; i++) {
setTimeout(function() {
console.log(i);
}, 1000);
}
原因:闭包会保持对外部变量的引用,如果不及时释放可能导致内存泄漏
解决方案:
jQuery大量使用闭包来维护内部状态,例如:
$(function() {
var counter = 0; // 闭包变量
$('#btn').click(function() {
counter++;
console.log('Clicked ' + counter + ' times');
});
});
理解作用域和闭包是掌握JavaScript核心概念的关键,合理运用可以写出更优雅、高效的代码。
没有搜到相关的文章