共计 793 个字符,预计需要花费 2 分钟才能阅读完成。
前言
闭包作为 JS 中的一大难点,相信许多小伙伴也常常为此疑惑,闭包到底是什么?它有什么用呢?
变量作用域
在学习闭包之前,你必须清楚知道 JS 中变量的作用域。
JS 中变量的作用域无非就全局变量和局部变量,两者之间的关系是函数内部可以直接访问全局变量,但是函数外部是无法读取函数内部的局部变量的。
闭包的诞生
在很多时候,我们想要获取函数的局部变量,但是上述我们已经说过了,正常情况下,这是没办法的,于是,闭包就诞生了。
!function(){
var n = 1
function f2(){alert(n)//1
}
}
上述代码就是一个闭包。函数 f2 被一个立即执行函数所包裹起来了,这时候这个立即执行函数中的所有局部变量对 f2 而言都是可访问的,所以才可以 alert 出 n 为 1,但是反过来 f2 中如果有局部变量,立即执行函数是访问不到的。
这就是 Javascript 语言特有的 ” 链式作用域 ” 结构(chain scope):子对象会一级一级地向上寻找所有父对象的变量。所以,父对象的所有变量,对子对象都是可见的,反之则不成立。
值得注意的是, 很多人听说闭包是需要函数套函数,然后 return 一个函数。
function foo(){
var local = 1
function bar(){
local++
return local
}
return bar
}
var func = foo()
func()
如上述代码所显示,闭包是需要函数套函数,其实只是因为我们需要局部变量,否则此变量就会变成全局变量,无法隐藏。而 return 一个函数,只是因为让外部能使用这个闭包,也就是上述的 bar 函数。
闭包的定义
说了这么多,闭包到底是什么?闭包其实就是「函数」和「函数内部能访问到的变量」(也叫环境)的总和。
闭包的作用
1. 可以间接调用函数内部的局部变量。
2. 可以让这些变量的值始终保持在内存中。(因此要注意不能滥用闭包)
3. 可以暂存数据, 给变量开辟私密空间, 避免外部污染。
正文完
发表至: javascript
2019-08-07