闭包的概念:为包含外部变量的函数及外部变量所创建的内存栈叫闭包
闭包的作用:通过函数调用的方式改变一个变量从而防止直接修改变量

Closures are created whenever a variable that is defined outside the
current scope is accessed from within some inner scope.

闭包的示例:

var local = "变量"
function bar() {
  console.log(local)
}

local 变量和 bar 函数就组成了一个闭包(Closure)

问题1:创建闭包一定要返回一个函数吗?

不一定:

function wait(message){
    setTimeout(function timer(){
        console.log(message)
    },1000)
}

wait("hi");

timer 函数访问了外部变量 message 就创建了闭包。
只要在某个内部作用域内访问在当前作用域之外定义的变量,就会创建闭包。

问题2:那为什么很多内嵌函数要被返回呢?

function foo(){
  var local = 1
  function bar(){
    return local
  }
  return bar
}

var func = foo()
func()

很多情况下如果不 return,就无法使用这个闭包。把 return bar 改成 window.bar = bar 也是一样的,只要让外面可以访问到这个 bar 函数就行了。

所以 return bar 只是为了 bar 能被使用,也跟闭包无关。

参考

「每日一题」JS 中的闭包是什么?
作用域和闭包

发表评论