垃圾回收机制
1. 概述
JS的垃圾回收机制是为了以防内存泄漏。
内存泄漏:当已经不需要某块内存时这块内存还存在着,垃圾回收机制就是间歇的不定期的寻找到不再使用的变量,并释放掉它们所指向的内存。
2.js垃圾回收方式
标记清除(mark and sweep)、引用计数(reference counting)。
1 标记清除(mark and sweep)
大部分浏览器以此方式进行垃圾回收,当变量进入执行环境(函数中声明变量)的时候,垃圾回收器将其标记为“进入环境”,当变量离开环境的时候(函数执行结束)将其标记为“离开环境”,在离开环境之后还有的变量则是需要被删除的变量。
垃圾收集器给内存中的所有变量都加上标记,然后去掉环境中的变量以及被环境中的变量引用的变量的标记。在此之后再被加上的标记的变量即为需要回收的变量,因为环境中的变量已经无法访问到这些变量。
2 引用计数(reference counting)
这种方式常常会引起内存泄漏,低版本的IE使用这种方式。机制就是跟踪一个值的引用次数,当声明一个变量并将一个引用类型赋值给该变量时该值引用次数加1,当这个变量指向其他一个时该值的引用次数便减一。当该值引用次数为0时就会被回收。
3.闭包
( 1 )函数嵌套函数
( 2 )在函数内部可以引用外部的参数和变量
( 3 )参数和变量不会被垃圾回收机制回收
4.闭包优缺点
使用闭包主要是为了设计私有的方法和变量
优点:可以避免全局变量 的污染
缺点:闭包会常驻内存, 增加内存使用 量,使用不当很容易造成内存泄漏
for循环相关知识点
for (var i = 0; i < 10; i++) {
setTimeout(() => {
console.log(i)
}, 200)
}//结果 10,10,10,10,10,10,10,10,10,10
let F = function (i) {
setTimeout(() => {
console.log(i)
}, 200)
}
for (var i = 0; i < 10; i++) {
F(i)
}//结果:0,1,2,3,4,5,6,7,8,9
for (var i = 0; i < 10; i++) {
(function (i) {
setTimeout(() => {
console.log(i)
}, 200)
})(i)
}//结果:0,1,2,3,4,5,6,7,8,9
for (let i = 0; i < 10; i++) {
setTimeout(() => {
console.log(i)
}, 200)
}//结果:0,1,2,3,4,5,6,7,8,9
补充:
1.自执行函数之前必须有分号
var a =6 //这里一定要有分号 ' ;'
(function(){
console.log(888)
})()//6 is not a function
2.关于for循环中 let 块级作用域
设置循环变量得部分是一个父级作用域,而循环体内部是一个单独得子作用域
for(let i=0;i<3;i++){
let i='aaa';
console.log(i)
}// aaa aaa aaa (三次都为aaa)