1、js的垃圾回收机制
- 浏览器自己做的
- 全局作用域声明的一个变量不会被回收,只有关闭浏览器才会回收
- 在局部作用域里面,变量在函数体执行完之后,就会被回收
2、闭包
1.可以访问别的函数作用域里面的变量或者参数的函数
2.创建闭包的方法:
一个函数里面嵌套一个函数,内部函数引用外部函数的变量或者参数,这里引用外部函数的变量不会被回收
function fun (){
var x = 1; // 在局部作用域里面,使用完之后就被回收
console.log(x);
}
fun();
var b = {
a: 5,
x: 10
}
alert(b.x);
b = null; // 释放堆内存的方式
(function (){})(); // 这不是闭包,只是一个函数表达式的自执行
function fn (){
let a = 10;
return a; // 可以获取内部函数的变量,但不是闭包
}
var b = fn();
console.log(b);
var x = 1;
function fun1 (){
var x = 10;
return function (){
x++;
console.log(x);
}
}
var y = fun1();
y(); // 这是一个闭包,y() = fun1()() 也就是返回的函数执行
/*
1.编译
var x;
function fun1 (){}
var y;
2.执行阶段
x = 1;
y = fun1();
y() = fun1()(); // 两次执行
*/
//闭包的用处
var aP = document.getElementsByTagName("p");
len = aP.length;
for (var i=0;i<len;i++){
// 使用自定义属性的写法
aP[i].index = i;
ap[i].onclick = function (){
console.log(this.index); // 打印出对应点击P的下标
}
// 使用闭包的写法
// 第一种写法
fun(i);
function fun (index){
aP[index].onclick = function (){
console.log(index); // 打印出对应点击P的下标
}
}
// 第二种写法
(function (index){
aP[index].onclick = function (){
console.log(index); // 打印出对应点击P的下标
}
})(i);
}