只要一个作用域通过某种手段持有了另一个作用域声明的变量或成员(也即存在未销毁的局部变量),这个变量或成员就叫做“闭包”。
用到的情况太多了,JS 对闭包的支持本来就算是它的一个语言特性,随便写写就会出现闭包,你自己写的代码里就会大量的出现闭包(不管你意识没意识到)。
还是举一例吧,拿著名的 jQuery 举例子:
Sizzle.selectors = {match: matchExpr,
filter: {
"ID": function( id ) {
var attrId = id
return function( elem ) {
return elem.id == attrId
}
},
"TAG": function( nodeNameSelector ) {
var nodeName = nodeNameSelector
return nodeNameSelector === "*" ?
function() { return true } :
function( elem ) {
return elem.tagName && elem.tagName === nodeName
}
}
}
}
这种 jQuery 源码中选择器的一段代码(太长未粘全),里面 attrId、nodeName 两个局部变量就是闭包。