问题: 闭包似乎有很多好处,但有什么负面影响?另外,我对闭包的理解是否正确?最后,一旦创建了闭包,它们会被销毁吗?
我一直在阅读有关Javascript Closures的一些信息。我希望有一点知识渊博的人会指导我的断言,纠正错误的地方。
关闭的好处:
我发现有用的是做一些关于本地/全球范围的基本测试:
<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时,都会执行返回。在这种情况下,返回是内部函数。
真正有趣的是定义局部变量时发生的本地化。注意global_num1和global_num2之间的第一个警报的差异,即使在尝试创建变量之前,global_num1也被认为是未定义的,因为'var'用于表示该函数的局部变量。 - 之前已经讨论过这个问题,按照Javascript引擎的操作顺序,很高兴看到它投入使用。
仍然可以使用Globals,但局部变量会覆盖它们。注意在第三次myFunc调用之前,创建了一个名为local_count的全局变量,但它对内部函数没有影响,内部函数有一个同名的变量。相反,每个函数调用都能够修改全局变量,正如global_var3所注意到的那样。
发表想法: 尽管代码很简单,但是对于你们来说警报很混乱,所以你可以即插即用。
我知道还有其他闭包的例子,其中很多都使用匿名函数和循环结构,但我认为这对101启动课程来说很有效。
我关注的一件事是关闭对内存产生的负面影响。因为它使函数环境保持打开,所以它还将这些变量保存在内存中,这可能/可能没有性能影响,尤其是关于DOM遍历和垃圾收集。我也不确定这会在内存泄漏方面发挥什么样的作用,我不确定是否可以通过简单的“删除myFunc;”从内存中删除闭包。
希望这有助于某人,
vol7ron