先来看看第一节的例子
'use strict'; function num(){ //用var声明一个变量num1 var num1 = 15; } alert(num1);//num1 is not defined
我们在函数外是访问不了函数内的局部变量!正常的情况下我们是办不到的
但我们这样写试试看!
'use strict'; function num(){ //用var声明一个变量num1 var num1 = 15; return function(){ return num1; } } var num2 = num(); var num3 = num2(); alert(num3);
这样我们就可以取到局部变量了。这就是闭包!
--闭包就是能够读取其他函数内部变量的函数。由于在Javascript语言中,只有函数内部的子函数才能读取局部变量,因此可以把闭包简单理解成"定义在一个函数内部的函数"。
所以,在本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁。
闭包的优点
闭包可以用在许多地方。它的最大用处有两个,一个是前面提到的可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中,不会在f1调用后被自动清除。
//通过闭包可以实现局部变量的累加 function sum(){ var age=21; return function(){ age++; return age; } } var my_age=sum(); alert(my_age()); alert(my_age()); alert(my_age()); 由于闭包里作用返回的局部变量资源不会被回收,所以可能会用更 多的内存。过度使用闭包会性能下,建议在非常有必要的时才使用闭包。
一些建议:学习变量前请先学习作用域和执行环境的概念(在第一节有说道)
另外看到过这样的回答:
闭包:在爷爷的环境中执行了爸爸,爸爸中返回了孙子,本来爸爸被执行完了,爸爸的环境应该被清除掉,但是孙子引用了爸爸的环境,导致爸爸释放不了。
这一坨就是闭包。
简单来讲,闭包就是一个引用了父环境的对象,并且从父环境中返回到更高层的环境中的一个对象。
希望对你理解闭包有帮助吧!
(完