Javascript中作用域和闭包的讨论
函数测试(){
var = 0; /本地变量
b = 1;全局变量
}
a = b =未定义的,B 1
同一名称的局部变量覆盖全局变量,但它们本质上是两个独立变量,一个变量的变化不影响另一个变量:
a = 5;函数a=5
函数测试(){
var a = 4;函数在值为4的范围内。
(});
a =函数值为5,影响函数
一般来说,函数完成后,函数的内部变量的引用都完成了。函数中的局部变量将被恢复,函数的执行环境将被清空。但是,如果内部函数作为函数返回,情况将发生变化。
函数测试(i){
var;
返回函数(){
返回B;
};
}
var =测试(8);
(a);返回值是64,内部变量B是63。
(a);返回值是63,内部变量B是62。
当内部函数作为返回值时,由于参考函数在内部变量未结束后,使得局部变量的函数不能被恢复,执行环境的功能得到保留,从而形成闭合效应,通过参考访问内部变量,应予以恢复。
闭包还使函数私有变量的局部变量只能通过返回的内部函数访问,并且不能以任何其他方式改变。
因此,闭包可以用来维护本地变量和保护变量。
不使用闭包:
如果a包含5个元素
对于(var i = 0,M = a.length;我<米;i++){
一个{我}。onclick=功能(e){
return'no. +我;
};
}
单击任意一个元素,返回值为5,因为i最终值为5。
使用闭包的情况:
函数测试(i){
返回函数(e){
return'no. +我;
};
}
如果a包含5个元素
对于(var i = 0,M = a.length;我<米;i++){
一个{我} onclick=测试(我);
}
使用闭包来维护本地变量,单击元素返回号0~4号。
虽然关闭带来方便,但也带来了一些缺点。
1。程序的复杂性增加,理解难度更大。
2。干扰正常的垃圾收集,复杂的闭包也可能导致内存崩溃。
三.大型闭包常常伴随性能问题。
因此,封袋应简单、紧凑,但不可大而复杂,同时应避免大规模使用封闭,封闭的外观本身就是语言的缺陷,但由于其独特的功能而保留下来,是一种辅助手段,而不是主要功能。