fat-cat

Closure 闭包

闭包是指有权访问另一个函数作用域中的变量的函数,即 闭包 = 函数 + 函数能够访问的自由变量 (自由变量指的是在函数中使用的,但既不是函数参数也不是函数的局部变量的变量

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 的函数都返回对应下标

关于 this 对象

匿名函数的执行环境具有全局性,指向 window

var name = 'This Window'

var obj = {
    name: 'My Obj',

    getNameFunc: function(){
        return function(){
            return this.name
        }
    }
}


console.log(obj.getNameFunc()()) // This Window

块级作用域

只要没有指向匿名函数的引用,只要函数执行完毕,就可以立即销毁其作用域链

(function(){
    // 这里是块级作用域
})()