Javascript中作用域和闭包的讨论

Javascript中作用域和闭包的讨论
Javascript函数的范围是由函数限定的,不同的函数有一个相对独立的范围,在内部,函数可以声明和访问全局变量,或者声明局部变量(使用var键,函数参数是局部变量),但不能在函数外部访问外部变量。

函数测试(){
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。干扰正常的垃圾收集,复杂的闭包也可能导致内存崩溃。

三.大型闭包常常伴随性能问题。

因此,封袋应简单、紧凑,但不可大而复杂,同时应避免大规模使用封闭,封闭的外观本身就是语言的缺陷,但由于其独特的功能而保留下来,是一种辅助手段,而不是主要功能。

tag:闭包作用域电脑软件Javascript

相关内容