发布网友
共2个回答
热心网友
闭包:是指有权访问另外一个函数作用域中的变量的函数。创建闭包的常见方式就是在一个函数内部创建另外一个函数。
在javascript中没有块级作用域,一般为了给某个函数申明一些只有该函数才能使用的局部变量时,就会用到闭包,这样可以很大程度上减少全局作用域中的变量,净化全局作用域。
使用闭包有如上的好处,当然这样的好处是需要付出代价的,代价就是内存的占用。
如何理解上面的那句话呢?
每个函数的执行,都会创建一个与该函数相关的函数执行环境,或者说是函数执行上下文。这个执行上下文中有一个属性 scope chain(作用域链指针),这个指针指向一个作用域链结构,作用域链中的指针又都指向各个作用域对应的活动对象。正常情况,一个函数在调用开始执行时创建这个函数执行上下文及相应的作用域链,在函数执行结束后释放函数执行上下文及相应作用域链所占的空间。
比如:
//声明函数
function test(){
var str = "hello world";
console.log(str);
}
//调用函数
test();
热心网友
先说句题外话,闭包这个名字取的就是错的,如果学过离散数学或者SICP的话,就知道闭包是离散数学中的概念。平时说的“闭包”在SICP中被称为“自由变量”。不过大家都这么叫,其实也无所谓了。
打个比方,有一家机器人餐厅,为了保证服务质量是一致的,每次客人进来时,会现场初始化一台机器人服务员为该客人服务,客人离场后销毁该机器人。后来餐厅开放了新服务:如果客人很喜欢这次的机器人的话,可以申请保留下来并得到一个机器人所有权凭证,下次来餐厅时出示这个凭证就可以由这个机器人为他服务,这个机器人也不会再因为客人离场而自动被销毁。
上面这个比方临时想的,可能不是很恰当,但是应该能看出来,“闭包”里的变量和“机器人餐厅”里的机器人是对应的,返回的闭包函数和凭证时一一对应的。觉得这就是为什么SICP中称这种机制里的变量为“自由变量”,因为这个变量不再受常规的变量生存周期制约,变得更加灵活,更加“自由”。
这是一些基础的理解,先把这个理解才能解决遇到的问题。