闭包是指有权访问另一个函数作用域中的变量的函数,即 闭包 = 函数 + 函数能够访问的自由变量 (自由变量指的是在函数中使用的,但既不是函数参数也不是函数的局部变量的变量)
function createComparisonFunction(propertyName){
return function(obj1, obj2){
var val1 = obj1[propertyName] // 加粗
var val2 = obj2[propertyName] // 加粗
if(val1 < val2) return -1
if(val1 > val2) return 1
return 0
}
}
// 回收闭包
var compareNames = createComparisonFunction('name')
var result = compareNames({ name: 'Tom'}, { name: 'Jon' })
compareNames = null
function createFunction(){
var result = []
for(var i = 0; i < 10; i++){
result[i] = function(){
return i
}
}
return result
}
createFunction() // 即位置 0 到 9 的函数都返回 10
function createFunction(){
var result = []
for(var i = 0; i < 10; i++){
result[i] = (function(num){
return function(){
return num
}
})(i)
}
return result
}
createFunction() // 即位置 0 到 9 的函数都返回对应下标
匿名函数的执行环境具有全局性,指向 window
var name = 'This Window'
var obj = {
name: 'My Obj',
getNameFunc: function(){
return function(){
return this.name
}
}
}
console.log(obj.getNameFunc()()) // This Window
只要没有指向匿名函数的引用,只要函数执行完毕,就可以立即销毁其作用域链
(function(){
// 这里是块级作用域
})()