闭包基本知识汇总

闭包基本知识汇总

一、什么是闭包?

闭包是指有权限访问另一个函数作用域中的变量的函数,在Javascript中,只有函数内部的子函数才能读取局部变量,因此可以把闭包简单理解成 “定义在一个函数内部的函数” 。所以,在本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁。闭包是一种JavaScript特有的一种函数结构(一种嵌套用法)。

二、闭包的特性:
  1. 函数嵌套:函数嵌套函数,内层函数使用了外层函数的变量(参数);

  2. 局部变量:在函数内定义具有共享意义的局部变量;—— 函数作用域

  3. 外部使用:内层函数被返回到外部 在外部调用,外部可通过这个内层函数访问声明在函数中的局部变量,而此变量在外部是无法通过其他途径被访问的;—— 这里的“返回”包括但不仅限于return;

  4. 词法环境不同:每个闭包都有它自己的词法环境;—— 词法作用域:根据源代码中声明变量的位置来确定该变量在何处可用。

  5. 变量不被回收:外层函数中,被引用的变量(参数)不会立即被垃圾回收机制回收;

三、闭包的作用:
  1. 使用闭包,可以延长局部变量的生命周期,由于内层函数使用了外层函数的变量,导致外层函数在执行结束后,变量没有被回收;

  2. 使用闭包,可以隔离作用域,避免被全局污染; —— 😭(window) => { … })(window);

  3. 使用闭包,可以保护具有共享意义的变量, 为其提供相关的操作接口(function),可以用来模拟私有方法

四、闭包的优点:
  1. 数据共享:使用闭包,在外层函数中,被引用的变量(参数)不会立即被垃圾回收机制回收,会一直被保存在内存中,实现数据共享;
  2. 数据私有化:使用闭包,在函数外部能够访问到函数内部的变量,但是它在外部是无法通过其他途径被访问的,实现数据私有化;
五、闭包的缺点:
  • 通过使用闭包,外层函数中被引用的变量(参数)不会立即被垃圾回收机制回收,会一直被保存在内存中,不会被释放,占用内存严重,造成内存泄漏,甚至栈溢出。

内存泄漏:由于疏忽或错误造成程序未能释放已经不再使用的内存

可能会导致栈溢出的场景:递归、自调用、超深循环等

六、简单的面试题

请编写一个简单的闭包

function fn(a) {
    return function(b) {
        console.log(a + b);
    }
}
var fn2 = fn(1);
fn2(5);

请编写一个函数add(3)(5) 让传入的参数相加

function add(a) {
    return function(b) {
        console.log(a + b);
    }
}
add(3)(5);

简单的封装

      
function objFnc() {
  var obj = {
    name: 'zhangsan',
    age: 20
  }
  return {
    get: function() {
      return obj;
    },
    set: function(name, val) {
      obj[name] = val;
      return obj;
    }
  };
}

var data = objFnc(); //* {get: ƒ, set: ƒ}
console.log("%c 🤷‍♀️: data.get() ", "font-size:16px;background-color:#fbf591;color:black;", data.get()) //8 {name: 'zhangsan', age: 20}
data.set('sex', 'man'); //* {name: 'zhangsan', age: 20, sex: 'man'}
console.log("%c 🤷‍♀️: data.get() ", "font-size:16px;background-color:#fbf591;color:black;", data.get()) //* {name: 'zhangsan', age: 20, sex: 'man'}
七、for循环中的闭包导致的错误,及其四种解决方案

详细见另一个文章for循环中的闭包导致的错误,及其四种解决方案,或手机直接扫码即可;

for循环中的闭包导致的错误,及其四种解决方案

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值