闭包的概念:闭包发生在创建函数时,实质是一个作用域,在该作用域中允许该自身函数访问并且操作该自身函数之外的变量
举个例子:
执行上面的代码可以看到打印出123,在函数testFunc里面可以访问变量testVar,这个全局作用域就是一个闭包。其实我们在实际工作中经常会写这样的代码,只是对闭包界定不是很清楚,具体问起来也不知道怎么来解释闭包。这个栗子可能还不够清晰,那么再举一个:
var outerValue = '我是外部变量'
var later
function outerFunction() {
var innerValue = '我是内部变量'
var innerFunction = function() {
console.log(outerValue)
console.log(innerValue)
}
later = innerFunction
}
outerFunction()
later()
//我是外部变量
//我是内部变量
- 闭包的核心原则:
- 内部函数的参数是包含在闭包中的;
- 作用域之外的所有变量,即便是函数声明之后的那些声明,也都包含在闭包中;
- 在相同的作用域中,尚未声明的变量不能提前引用(变量提升)。
- 闭包的优点
1. 利用闭包作用域特性可以将一些变量(函数也是变量)隐藏起来,实现私有化。为什么要隐藏呢?依据软件设计中的最小特权原则,应该最小限度的暴露必要内容,而将其他内容都隐藏起来,比如某个模块或者对象的API设计。如果所有变量和函数都在全局作用域中,当然可以在所有的内部嵌套作用域中都访问到它们。但是一句最小特权原则应该设法将其私有化。
2. 规避冲突。像jQuery等第三方库都会妥善的将内部私有的函数和变量隐藏起来,防止在使用过程中如果有意或者无意使用了相同的变量名或者函数名引发冲突。
- 闭包缺点
将函数片段用函数包含起来,首先会起一个函数名,这个函数名本身也就污染了所在的作用域;其次必须通过函数名调用才能运行其中的代码。解决方案:立即执行函数。用表达式将函数片段包起来,然后立即执行。这个函数名在所在作用域中不能被调用,它只被绑定在函数表达式自身的函数中。