闭包让你可以在一个内层函数中访问到其外层函数的作用域。在 Javascript 中,每创建一个函数同时都会创建一个闭包,一个函数包含对外层函数作用域的引用就叫闭包。
以下是一个简单的闭包示例
function foo() {
var name = 'goo'
return function bar() {
return name
}
}
词法一词指的是,词法作用域根据代码中声明变量的位置来确定该变量在何处可以可用
Javascript 的函数形成闭包,闭包是由函数以及声明该函数的词法作用于环境组合而成。该环境包含了这个闭包创建时作用域内的任何局部变量
闭包的用法
避免变量提升
通过包裹函数嵌套函数,让定义的变量不会提升到全局,造成变量污染。
(function(){
var name = 'go'
function bar() {
return name
}
bar()
})()
模块化
通过闭包来实现模块化,可以定义私有的变量和方法同时也可以定义公共的方法。
var p = function() {
var name = 'go'
function getName() {
return name
}
function setName(v) {
name = v
}
return {
getName,
setName,
}
}
解决循环中的变量传递问题
比如下面通过循环来给多个 dom 绑定事件,因为变量的提升,造成 click 的事件引用的都是同一个变量,最后都是同一个值
var arr = [1,2,3,4,5]
for (var i = 0; i < arr.length; i++) {
document.getElementById('id' + i).onClick = function() {
console.log(i)
}
}
通过用匿名函数来包裹事件绑定,使变脸和事件的回调函数在一个闭包中
var arr = [1,2,3,4,5]
for (var i = 0; i < arr.length; i++) {
(function(){
var ii = i
document.getElementById('id' + ii).onClick = function() {
console.log(ii)
}
})()
}
网友评论