闭包到底是如何工作的?

闭包到底是如何工作的?

文章来源自Stack Overflow网站上,Aaron Hall提问的问题,这里重点讲的是回答中得票数最高的一个人的答案,希望能够帮助大家更好的了解到闭包的作用,当然,有些语法和翻译上会有些错误,可以向我指出。
本人的邮箱:aleenli1992@gmail.com

原问题:

你怎么给一个有一些JS基础的,知道一点闭包概念的包括(函数,变量,诸如此类)的人,去解释JS中的闭包这个概念呢?

我也看过一些维基百科中的例子,但是很不幸,那一点用处也没有。

回答者:flying sheep

闭包并不神奇

这篇文章是使用JS的代码去解释闭包以便程序员去理解他,并不是针对于一些大师和专业的开发者。

一旦你挖掘了核心概念的话,闭包会很容易理解。无论如何,如果你想要通过一些专业的论文,或者是学术性质的文章去理解他的话,我只能说那是不可能的。

这篇文章适合有主流编程语言经验的程序员,那种呢?就是看的懂下面这行代码的那种:

1
2
3
4
5
6
function sayHello(name){
var text = 'hello' + name
var say = function { console.log(text) }
say()
}
sayHello('joe')
一个闭包的例子:

两句话总结:

  1. 闭包是支持一级函数的一种方式,他是一个表达式,可以引用该作用域内的变量(当它被首次声明时),将它分配给一个变量,或者传递成一个函数的参数,或者作为一个函数结果返回。
  2. 当一个函数开始执行的时候,闭包是一个被分配的栈帧,并且函数的返回值不会被限制。栈帧的意思是指一个函数调用单独分配的那部分栈空间。(就好像一个栈帧被分配在堆中,并不是在栈中).

下面代码返回的是一个函数的引用

1
2
3
4
5
6
7
function sayHello2(name) {
var text = 'Hello ' + name; // 局部变量
var say = function() { console.log(text); }
return say;
}
var say2 = sayHello2('Bob');
say2(); // logs "Hello Bob"

大部分的JS程序员都明白上面的代码里,如何将对函数的应用返回到变量(say2)上。如果你不明白的话,你最好搞懂这个再来学习闭包。如果一个程序员使用C语言的话,他会思考函数的返回值是指向这个函数的,并且变量say和say2都是执行同一个函数。