闭包(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)