本周学习:本周主要学习了js高级的知识点,包括:原型原型链,作用域作用域链,变量提升函数提升,执行上下文执行上下文栈,闭包,对象创建模式继承模式,进程与线程,浏览器内核,h5 Web Workers等内容。下边写一下关于我对闭包的理解:
1 什么是闭包?
两种理解方式:
理解一:必包是嵌套的内部函数
理解二:包含被引用的变量的对象(注:闭包存在于嵌套的内部函数中)
2 产生闭包的条件?
一:函数嵌套
二:内部函数引用了外部函数的数据变量或函数
三: 执行外部函数(可以不调用内部函数,但必须调用外部函数)
3 闭包的作用是什么?
一:延长局部变量的生命周期
二:让函数外部可以操作(读写)另一个函数中的数据(变量或函数)
4 闭包的优点和缺点以及缺点的解决方式
优点:
一:隐藏变量,避免全局污染
二:读取函数内部的数据
缺点:
一:函数执行完之后函数内局部变量没有释放,占用内存时间会变长;
二:统一造成内存泄漏
缺点的解决方式:
一:能不用就不用
二:及时的释放闭包
5 闭包的生命周期
一: 产生:嵌套的内部函数定义指定完就产生了闭包(不是在调用)
二:死亡:嵌套的内部函数成为垃圾对象时(引用闭包的对象不再引用时)
6 闭包的常见用法
一:return一个函数
var n = 10
function fn1(){
var n =20
function fn2() {
n++;
console.log(n)
}
return fn2
}
var x = fn1()
x() // 21
二:将函数作为一个参数
var a = 'aaa'
function foo(){
var a = 'foo'
function fo(){
console.log(a)
}
return fo
}
function f(p){
var a = 'f'
p()
}
f(foo())
7 利用闭包实现循环遍历监听(只写出了主要代码)
需求:有几个按钮,需要点击之后显示对应的编号(点击第一个btn打印出来1,点击第二个btn打印出来2)
var btns =document.getElementsByTagname('button');
for (var i=0,length = btns.length;i<length;i++){
(function(i){
var btn =btns[i];
btn.onclick = function({
console.log('第'i+1'个');
}
})(i)
}