闭包

55 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第1天,点击查看活动详情 自己的理解总结

1.一个普通的函数function , 如果它可以访问外层作用域的自由变量,那么这个函数就是一个闭包

2.从广义的角度来说: javaScript中的函数就是闭包

3.从侠义的角度来说:javaScritpt中的函数,如果访问了外部

作用域的变量,那么它是一个闭包

函数和方法的定义

// 函数function:独立存在的function,那么就称之为函数
function foo(){

}

//方法 method: 当我们的函数属于某一个对象时,我们称这个函数是这个对象的方法
var obj = {
    foo:function(){}
}
obj.foo

js高阶函数(常用) 定义:JavaScript的函数其实都指向某个变量,那么函数指向函数,这种函数就被称之为高阶函数。

通俗的定义:把一个函数如果接受另一个函数作为参数,或者该函数会返回另一个函数作为返回值的函数,那么这个函数就称之为高阶函数

数组中得高阶函数

// obj.foo
//1.filter: 过滤
let nums = [10, 5, 11, 100, 55]
var newNums = nums.filter(function(item){
    return item % 2 === 0 //偶数
    // 只有返回 true 的时候才会被返回添加新的数组中
})
console.log(newNums)


//2.map :映射

var newNums2 = nums.map(function(item){
    return item 
})
console.log(newNums2)

// 3.forEach :迭代

//4.find/findIndex 查找
//5.reduce :累加 (第一个参数为 上一次的值)
var total = nums.reduce(function(prevValue, item){
    return prevValue + item
},0) //0自己定义一个初始值

console.log(total)

闭包案例解决内存泄漏

function foo(){
    var name = "foo"
    var num = 18
    function bar(){
        console.log(name)
        console.log(num)
    }
    return bar
}
var fn = foo()
fn()
// fn 只调用了一次 所以造成了内存泄漏 foo指向的内存地址没有被销毁
// 没有被销毁的原因:因为 bar 一直指向这父级作用域foo(parentScope)
fn()
fn()
fn()
// 如果调用多次就不存在内存泄漏因为你一直再用 后续也在用

// 解决内存泄漏的方式
fn = null