闭包
指有权访问另一个函数作用域中的变量的函数 通俗来说就是 一格作用域可以访问另一个函数内部的局部变量
一、js闭包的好处
js闭包的好处
让一个函数有权访问另一个函数作用域中变量的函数
1.如果希望一个变量长期驻扎在内存中(因为javascript本身具有垃圾回收机制,即为:当一个函数被调用,执行完毕后,就会被系统自动释放,而js闭包在外部函数执行完毕时不释放内存,可以使一个变量长期驻扎在内存中)
2.可以避免全局污染,下面我们来看一段测试代码
二、例题
<script>
function fun() {
var num = 10;
function f() {
console.log(num);
}
return f();
}
var k = fun();
/*类似于
var k = function () {
console.log(num);
}*/
var lis = document.querySelector('ul').querySelectorAll('li');
// 三秒后打印所有 li 的内容 与下题原理相同
for (var x = 0; x < lis.length; x++) {
(function (x) {
setTimeout(function () {
console.log(lis[x].innerHTML);
}, 3000)
})(x);
}
// 点击 li 获取编号 闭包思想
for (var i = 0; i < lis.length; i++) {
// 每执行执行一次循环 创建一个 立即执行函数 ()()
(function (i) { // 2、 函数接受到 参数 i
lis[i].onclick = function () {
console.log(i); // 3、 打印
}
})(i) // 1、 将循环索引 i 传递给立即执行函数
}
// 打车案例
var car = (function () {
var start = 10;
var total = 0;
return {
// 正常总价
price:function (n) {
if(n<=3){
total = start;
}else {
total = total +(n-3)*start;
}
return total;
}
}
})()
console.log(car.price(50)+"元");
</script>