JS中的闭包是什么

闭包其实很简单

什么是闭包

为了便于理解我在代码中使用了中文:

1
2
3
4
5
6
7
!function(){
var a = '局部变量a'
function fn(){
console.log(a)
}
return fn
}

在上面的代码中,在一个立即执行函数中有一个局部变量a,有一个函数fn,在函数fn中可以访问到局部变量a,这就是一个闭包:
如果一个函数使用了它范围外的变量,这个函数+这个变量就叫做闭包。

闭包需要函数嵌套函数,再return一个函数吗?
  • 把a嵌套在一个立即执行函数里是为了获得一个局部变量,如果不把a放在函数里,a就是一个全局变量,无法达到闭包的目的——隐藏变量。
    所以嵌套函数是为了获得一个局部变量,与闭包无关。
  • return fn 相当于 window.fn = fn ,这是为了让外面可以访问到fn这个函数。
    所以 return 是为了fn能被使用,也与闭包无关。

    闭包的作用

    闭包用来间接访问一个变量,也就是隐藏变量。 例如,不想让人直接访问一个变量a,可以将变量a作为局部变量,在一个立即执行函数里声明变量a,但是局部变量别人又访问不到,所以需要暴露一个访问器(函数),让别人可以间接访问。
    1
    2
    3
    4
    5
    6
    !function(){
    var a = '局部变量a'
    window.间接访问a = function(){
    console.log(a)
    }
    }

所谓闭包的作用,我们在写代码时并没有刻意地去用闭包,写完以后发现满足了闭包的定义。

原文 方应杭:JS中的闭包是什么