闭包 Closure

闭包 Closure

前言

变量作用域

要理解闭包,就要理解javascript特殊的变量作用域

变量的作用域无非就是两种:全局变量,局部变量

javascript的特殊之处就在于:函数内部可以访问到全局变量,但在函数外无法读取到函数的局部变量

注意:在函数内部声明变量的时候,要用var关键字。如果不用的话,实际上创建的是全局变量

什么是闭包

【函数】和【函数内部能访问到的局部变量】(也叫环境)的总和叫闭包
就这么简单!
我们常见的闭包的实现方式是函数内嵌套函数 然后 runturn一个函数

function foo(){
  var local = 1
  function bar(){
    local++
    return local
  }
  return bar
}

var func = foo()
func()

这里面确实有闭包,local变量和bar函数就组成了一个闭包(Closuse)

为什么需要嵌套函数呢?

是因为需要局部变量,才需要把local,放到一个函数里。
如果不把local放到函数里,local就是一个全局变量了,就达不到使用闭包的目的——隐藏变量

所以嵌套函数只是为了制造局部变量,跟闭包无关

为什么要返回函数 (return bar)

因为如果不return bar ,你就无法使用这个闭包。把return bar 改成 window.bar = bar 也是一样的。只要外面能访问到这个函数就行了

所以return bar 只是为了bar ,能被使用,和闭包无关

闭包的作用是什么

闭包常常用来【间接访问变量】换句话说【隐藏变量】
闭包可以用在很多地方,但它最大的用处有两个:

  1. 可以读取到函数内部的值
  2. 函数中的这些变量的值存在内存中

使用闭包的注意点

  1. 使用闭包会使函数中的变量存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄漏。
    解决方法,在退出函数前,将不能使用的局部变量删除

内存泄漏:指你用不到的变量还占据着内存空间,不能再次利用起来
关于IE:IE 有bug,在我们使用完闭包之后,依然回收不了里面引用变量的值

  1. 闭包会在父函数外部,改变函数内部变量的值。所以把父函数当作对象object 使用,把内部函数作为公共方法 public method,把内部函数的变量,当作私有属性 private value,这时一定小心,不要随意改变父函数内部变量的值。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值