1嫁审、js的垃圾回收機制
- 瀏覽器自己做的
- 全局作用域聲明的一個變量不會被回收,只有關閉瀏覽器才會回收
- 在局部作用域里面失驶,變量在函數(shù)體執(zhí)行完之后土居,就會被回收
2、閉包
1.可以訪問別的函數(shù)作用域里面的變量或者參數(shù)的函數(shù)
2.創(chuàng)建閉包的方法:
一個函數(shù)里面嵌套一個函數(shù)嬉探,內(nèi)部函數(shù)引用外部函數(shù)的變量或者參數(shù),這里引用外部函數(shù)的變量不會被回收
function fun (){
var x = 1; // 在局部作用域里面擦耀,使用完之后就被回收
console.log(x);
}
fun();
var b = {
a: 5,
x: 10
}
alert(b.x);
b = null; // 釋放堆內(nèi)存的方式
(function (){})(); // 這不是閉包,只是一個函數(shù)表達式的自執(zhí)行
function fn (){
let a = 10;
return a; // 可以獲取內(nèi)部函數(shù)的變量涩堤,但不是閉包
}
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()() 也就是返回的函數(shù)執(zhí)行
/*
1.編譯
var x;
function fun1 (){}
var y;
2.執(zhí)行階段
x = 1;
y = fun1();
y() = fun1()(); // 兩次執(zhí)行
*/
//閉包的用處
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);
}