立即执行函数和闭包

什么是立即执行函数

function(){}.call() // 立即执行函数

如何使用立即执行函数

  1. 我们不想要全局变量
  2. 我们要使用局部变量
  3. ES 5 里面,只有函数有局部变量
  4. 于是我们声明一个 function xxx,然后 xxx.call()
  5. 这个时候 xxx 是全局变量(全局函数)
  6. 所以我们不能给这个函数名字
  7. function(){}.call()
  8. 但是 Chrome 报错,语法错误
  9. 试出来一种方法可以不报错:
    1. !function(){}.call() (我们不在乎这个匿名函数的返回值,所以加个 ! 取反没关系)
    2. (function(){}).call() 不推荐
      xxx
      (function(){}).call() 报错
    3. frank192837192463981273912873098127912378.call() 不推荐
  10. 用 window 就变成全局变量
!function(){
    var person = window.person = {
        name: 'frank'
    }
}.call()

!function(){
    var person = window.person
    console.log(person)
}.call()

什么是闭包

函数访问了函数外面的变量,这个函数和变量就是闭包。

如何使用闭包

  1. 立即执行函数使得 person 无法被外部访问
  2. 闭包使得匿名函数可以操作 person
  3. window.frankGrowUp 保存了匿名函数的地址
  4. 任何地方都可以使用 window.frankGrowUp

综上4点得: 任何地方都可以使用 window.frankGrowUp 操作 person,但是不能直接访问 person

!function(){
    var person = {
        name: 'frank',
        age: 18
    }
    window.frankGrowUp = function(){ // 闭包
        person.age += 1
        return person.age
    }
}.call() // 立即执行函数用来隔离作用域,person变成局部作用域

!function(){
    var newAge = window.frankGrowUp() // 不加() 就等于函数体,不执行
    console.log(newAge)
}.call() // 19
var accessor = function(){
    var person = {
        name: 'frank',
        age: 18
    }
    return function(){ // 闭包
        person.age += 1
        return person.age
    }
}

var growUp = accessor.call()
console.log(growUp.call()) // 19
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容