闭包
闭包就是内部的函数被拿到外部调用,会造成原本的作用域链不会被释放,就会造成内存泄漏
- 上期讲到了什么是作用域链如果不了解可以去看看
- 这个b是在函数内部声明的函数,这个函数属于a函数的作用域不能在外部被调用,如果被调用肯定会报错阻止进程,但是形成了闭包就可以被外部调用
- 那什么样会形成闭包呢,可以来说只要 return就是闭包了
- 逻辑:
—全局作用域里面本来没有b这个函数,就不能被调用如果被调用就会报错,但是现在可以在全局里面被调用了不会报错
是因为每个函数执行前会创建一个AO用来支持该函数运行用完立即销毁,但是现在一个函数里面还有一个函数,当函数a被执行完本来AO就该销毁了,但是想想如果a函数的AO被销毁了那里面的b函数怎么办呢,这时候就形成了闭包,a函数的AO就不会被销毁因为还有b函数没有被i调用,但是还需要return出去才能在全局里面调用。return了基本就是闭包
注意:形成了闭包一定会造成内存泄漏
function a(){
var num = 0;
function b(){
num++;
console.log(num+"这是一个闭包");
}
return b;
}
var str = a();
str()
—其实是把b函数返回给了a函数,外部需要一个变量来接收a函数执行返回来的值,这个值就是b函数,用外部声明的str执行b函数执行符号(),这里的知识也包含了作用域链
- 什么是内存泄漏:一个函数运行之前创建支持该函数运行的AO用完就销毁,但是形成闭包了就无法销毁就会造成内存泄漏,久而久之多了内存就会卡顿
包装类
- Number()
- String()
- Boolean()
- 包装类就是本来一个变量没有Number()、String()、Boolean()属于他们的方法比如:
- 数字Number()类型的parseFloat()等等众多方法
- 字符串String()类型的charAt()等等众多方法
- 布尔Boolean()类型的true或false等等众多方法
—都是通过JS的包装类给这些变量来包装这些方法所以才能使用方法和属性