问题:闭包似乎有很多好处,但有哪些缺点呢?另外,我对闭包的理解是否正确?最后,一旦创建了闭包,它们可以被销毁吗?
我读了一些关于 Javascript 闭包的文章。我希望有更懂行的人能够指导我的主张,纠正我的错误之处。
闭包的好处:
- 使用内部函数将变量封装到局部作用域。
该函数的匿名性微不足道。
我发现有用的是做一些关于本地/全局范围的基本测试:
<script type="text/javascript">
var global_text = "";
var global_count = 0;
var global_num1 = 10;
var global_num2 = 20;
var global_num3 = 30;
function outerFunc() {
var local_count = local_count || 0;
alert("global_num1: " + global_num1); // global_num1: undefined
var global_num1 = global_num1 || 0;
alert("global_num1: " + global_num1); // global_num1: 0
alert("global_num2: " + global_num2); // global_num2: 20
global_num2 = global_num2 || 0; // (notice) no definition with 'var'
alert("global_num2: " + global_num2); // global_num2: 20
global_num2 = 0;
alert("local_count: " + local_count); // local_count: 0
function output() {
global_num3++;
alert("local_count: " + local_count + "\n" +
"global_count: " + global_count + "\n" +
"global_text: " + global_text
);
local_count++;
}
local_count++;
global_count++;
return output;
}
var myFunc = outerFunc();
myFunc();
/* Outputs:
**********************
* local_count: 1
* global_count: 1
* global_text:
**********************/
global_text = "global";
myFunc();
/* Outputs:
**********************
* local_count: 2
* global_count: 1
* global_text: global
**********************/
var local_count = 100;
myFunc();
/* Outputs:
**********************
* local_count: 3
* global_count: 1
* global_text: global
**********************/
alert("global_num1: " + global_num1); // global_num1: 10
alert("global_num2: " + global_num2); // global_num2: 0
alert("global_num3: " + global_num3); // global_num3: 33
</script>
我从中取出了一些有趣的东西:
outerFunc 中的警报仅被调用一次,即当outerFunc 调用被分配给myFunc (myFunc = outerFunc()) 时。这个分配似乎使outerFunc保持打开状态,我称之为持久状态。
每次调用 myFunc 时,都会执行 return。在这种情况下,返回的是内部函数。
真正有趣的是定义局部变量时发生的本地化。请注意第一个警报中 global_num1 和 global_num2 之间的差异,即使在尝试创建变量之前,global_num1 也被视为未定义,因为“var”用于表示该函数的局部变量。 -- 这之前已经讨论过,按照 Javascript 引擎的操作顺序,很高兴看到它投入工作。
全局变量仍然可以使用,但局部变量将覆盖它们。请注意,在第三次 myFunc 调用之前,创建了一个名为 local_count 的全局变量,但它对内部函数没有影响,该函数具有一个同名的变量。相反,每个函数调用都能够修改全局变量,如 global_var3 所注意到的。
发帖感想:尽管代码很简单,但它对你们来说却充满了警报,因此您可以即插即用。
我知道还有其他闭包的例子,其中很多都使用匿名函数与循环结构相结合,但我认为这对于 101 初学者的课程来说有利于看到效果。
我担心的一件事是闭包会对内存产生负面影响。因为它保持函数环境打开,所以它也将这些变量存储在内存中,这可能/可能不会影响性能,特别是在 DOM 遍历和垃圾收集方面。我也不确定这在内存泄漏方面会起到什么样的作用,并且我不确定是否可以通过简单的“delete myFunc;”从内存中删除闭包。
希望这对某人有帮助,
vol7ron
None
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)