这个问题其实在问:闭包
MDN的解释:闭包是函数和声明该函数的词法环境的组合。函数
按照个人理解就是:闭包 =『函数』和『函数体内可访问的变量总和』this
举个简单的例子:代理
(function() { var a = 1; function add() { var b = 2 var sum = b + a console.log(sum); // 3 } add() })()
add
函数自己,以及其内部可访问的变量,即 a = 1
,这两个组合在一块儿就被称为闭包,仅此而已。code
闭包最大的做用就是隐藏变量,闭包的一大特性就是内部函数老是能够访问其所在的外部函数中声明的参数和变量,即便在其外部函数被返回(寿命终结)了以后ip
基于此特性,JavaScript能够实现私有变量、特权变量、储存变量等get
咱们就以私有变量举例,私有变量的实现方法不少,有靠约定的(变量名前加_),有靠Proxy代理的,也有靠Symbol这种新数据类型的。io
可是真正普遍流行的实际上是使用闭包。console
function Person(){ var name = 'cxk'; this.getName = function(){ return name; } this.setName = function(value){ name = value; } } const cxk = new Person() console.log(cxk.getName()) //cxk cxk.setName('jntm') console.log(cxk.getName()) //jntm console.log(name) //name is not defined
函数体内的 var name = 'cxk'
只有 getName
和 setName
两个函数能够访问,外部没法访问,相对于将变量私有化。function