闭包是指有权访问另一个函数作用域中的变量的函数,即 闭包 = 函数 + 函数能够访问的自由变量 (自由变量指的是在函数中使用的,但既不是函数参数也不是函数的局部变量的变量)
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(){
    // 这里是块级作用域
})()