闭包

封装对象/变量的细节
-立即执行函数使得 person 无法被外部访问

  • 匿名函数可以访问/操作person
  • window.growUp保存了匿名函数的地址
  • 任何地方都可以访问window.growUp
  • 任何地方都可以访问window.growUp,来操作person,但是不能直接访问person.
!function(){
  var person = {
    name:'jack',
    age:18
  }
}.call()
let a = person.age//Uncaught ReferenceError: person is not defined

person的作用域是立即执行函数内,所以会是not defined。使用闭包可以解决这个问题。

!function(){
  var person = {
    name:'jack',
    age:18
  }
window.growUp = function (){
    return person.age +=1
  }
window.personAge = function(){
    return person.age
  }
}.call()
window.growUp()
window.personAge()

另一种写法

var accessor  = function(){
  var person = {
    name:'jack',
    age:18
  }
return function (){
     return person.age += 1
  }
}
var growAge = accessor.call()
growAge.call()

可以通过返回一个对象来返回多个接口

var accessor  = function(){
  var person = {
    name:'jack',
    age:18
  }
return {
    growAge:function (){
    return person.age += 1
    },
    getAge:function (){
    return person.age
    }
  }
}

你可能感兴趣的:(闭包)