Javascript 闭包

2018 年 10 月 2 日 0 条评论 2.16k 次阅读 1 人点赞

闭包(closure)。指的是一种函数,这种函数使用了在它周围作用域下定义的变量。

MDN 里的关于闭包的中文文档非常好的解释了什么是闭包。闭包是一种特别的对象,也可以说是一种特别的函数,这种对象有两个部分组成,一部分是函数本身,还有一部分是创建这个函数的时候的这个函数所在的那个环境。也就是闭包是函数 + 环境。

也就是函数在某种特别情况下被创建,就会形成闭包。这个特别情况就是,函数使用了在它自己的局部作用域以外定义的变量。

看个例子:

function robot() {
  var name = '小猫'
  function greet() {
    console.log('我是${name},喵 ~')
  }
  return greet
}

var kitty = robot()
kitty()

robot 函数里定义了一个局部变量叫 name,在 robot 函数里又返回了一个函数,名字是 greet,在这个内部函数里使用了在 robot 局部作用域下定义的变量 name。这就形成了一个闭包。也就是 kitty 就是一个闭包,这个闭包是 greet 函数,还有 greet 函数引用的 name 所组成的。

再看一个例子:

function robot(name) {
  function greet(greeting) {
    console.log('我是${name}, ${greeting},')
  }
  return greet
}

var kitty = robot('小猫')
kitty('喵 ~ ') // 输出:我是小猫, 喵 ~

var puppy = robot('小狗')
puppy('汪汪 ~') // 输出:我是小狗,汪汪 ~

这回 robot 函数带一个 name 参数,robot 还会返回一个 greet 函数,返回的这个 greet 函数也带一个参数,就是 greeting,在这个 greet 函数里我们用到了 robot 的 name 参数,还有 greeting 本身的参数 greeting 。

我们基于 robot 又创建了两个函数,kitty,还有 puppy,这两个东西都是闭包 。这两个函数的主体部分都是一样的,不一样的地方是,在创建它们的时候的环境是不一样的。在创建 kitty 的时候,name 的值是 “小猫”,在创建 puppy 的时候,name 的值是 “小狗”。

雷雷

这个人太懒什么东西都没留下

文章评论(0)

(Spamcheck Enabled)