我正在使用闭包,我来到这段代码:
doit = true;
aww = function() {
if(doit) {var foo; doit = false;} else {}
foo = 0; foo += 1; return foo;
}
doit
是aww
函数仅用于定义/ delcare foo
一次的变量。
当我第一次执行aww
时,它将foo
作为局部变量(并设置为在将来的调用中不声明它),然后将foo
指定为0并将其增加1。并返回它(1)
我希望,下次我致电aww
时,foo
变量不会先声明,因此aww
函数应首先创建foo
并使其 global ,因为它尚未声明,并且在它之前没有任何var的情况下被分配给0。但真正发生的事情与我的期望不同。
foo
不会成为全球性的,它仍然是本地的。
假设在函数执行结束后函数的作用域仍然存在,这是真的吗? 或者如果没有,是否只保留 localy声明变量列表保存在某处? 我读过有关闭包的内容,但并不完全理解它们。对这个问题的回答使得闭包对我来说比以前更加清晰。 THX。
答案 0 :(得分:1)
你的职能:
aww = function() {
if(doit) {var foo; doit = false;} else {}
foo = 0; foo += 1; return foo;
}
被解释为它是这样编写的:
aww = function() {
var foo;
if(doit) {doit = false;} else {}
foo = 0; foo += 1; return foo;
}
该函数将始终返回1,因为foo
始终设置为0
,然后由函数设置为1
。变量声明被视为发生在函数顶部。
对doit
的引用是与闭包有关的部分。因为该变量在函数外部,所以函数会在第一次调用时将其值切换为false,然后不会再次更改它。 可以访问doit
并依赖其值在调用之间保持不变,除非其他内容可以访问doit
并进行更改。
另一方面,变量foo
是函数的简单局部变量。每次调用该函数都会创建一个全新的foo
,并且该调用与之前的任何foo
都没有任何关系。