1.高阶函数
高阶函数是对其他函数进行操作的函数,它接收函数作为参数或者将函数作为返回值输出。
// 接收函数作为参数
function fn(callback) {
callback && callback();
}
var foo = ()=>{
alert('hello world')
}
fn(foo)
// 将函数作为返回值,既是高阶函数又运用了闭包
// 内部访问到外部,然后把内部的值返回出去,外部在调用时就可以访问到
// outer()是调用里面的inner这个函数,再次()就是inner调用其内部
function outer() {
var num = 1;
function inner() {
var n = 2;
alert(n + num);
}
return inner;
}
outer()()
2.闭包
优点:
1.内部作用域可以访问外部作用域中的变量,延长了作用域的范围。
2.可以使变量长期保存在内存中。
缺点:消耗内存 ,影响页面性能
1.用var定义的for循环中使用setTimeout ,通过自调用,产生闭包
// 打印1,2,3,4,也可以把var改为let
// 不使用闭包打印4个4
for (var i = 0; i <= 3; i++) {
(function (i) {
setTimeout(() => {
console.log(i);
}, i * 1000);
})(i);
}
2.定义在一个函数内部的函数
闭包使内部函数可以访问外部函数中的变量,inner函数是一个闭包,所以他会一直存在内存中,又因为num是outer函数的局部变量,inner函数会依赖outer函数,所以outer函数也会一直存在内存中,并不会像普通函数一样,在调用后就被垃圾回收。
//将函数作为返回值,此处也用了闭包
function outer() {
var num = 1;
return function inner() {
num++
}
}
outer()()
闭包会导致内存泄漏吗?
看了好多文章都说会,后来又查了下资料,应该是不会。由于IE9之前的版本对于javaScript和DOM对象使用不同的垃圾回收机制,这是IE的问题,所以闭包与内存泄漏没有关系。