闭包
1.垃圾回收机制
思想:确定哪个变量不会再使用,然后释放它。它是周期性的,即每隔一段时间它会自动运行。函数没有被引用执行完以后这个函数的作用域就会被销毁,如果一个函数被其他变量引用,这个函数的作用域将不会被销毁。
垃圾回收机制跟踪记录哪个内存还会再使用以及哪个内存不会使用,以便回收内存。
标记策略和引用策略。
标记清除:通过判断一个变量是否在环境中被引用,来进行标记删除;
引用技术:跟踪记录每个变值被引用的次数
2.函数的特点:
1)函数可以嵌套函数
2)函数自调,即函数可以自己调用自己
(function(i)){ //作用域 }(i); //相当于: var y=function(i){ //作用域 } y(i);
for(var i=0;i<10;i++){ var y=function(i){ var a=document.createElement('a'); a.innerHTML=i+"<br>"; a.addEventListener('click',function(){ console.log(i) }) document.body.appendChild(a); } y(i); }
3.闭包(能够读取其他函数内部的函数)
function fn1(){ var a=100; return function(){ console.log(a); } } var fn2=fn1(); fn2(); //100
作用域环境中访问变量的权利是由内向外的,内部作用域可以获得当前作用域下的变量并且可以获得当前包含当前作用域的外层作用域下的变量
在外层作用域下无法获取内层作用域下的变量,同样在不同的函数作用域中也是不能相互访问彼此变量的,那么我们想在一个函数内部也有限权访问另一个函数内部的变量该怎么办呢?闭包就是用来解决这一需求的,闭包的本质就是在一个函数内部创建另一个函数。
我们首先知道闭包有3个特性:
①函数嵌套函数
②函数内部可以引用函数外部的参数和变量
③参数和变量不会被垃圾回收机制回收
function a(){ var c='hah'; return function(){ return c; } } let b=a(); console.log(b()) // hah
闭包主要有以下两种应用场景
- 函数作为返回值
- 函数作为参数来传递
function F1(){ var a = 100 return function (){ console.log(a) } } var f1 = F1() function F2(fn){ var a = 200 fn() } F2(f1)

浙公网安备 33010602011771号