我正在使用闭包,我来到这个代码:
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
不会成为全球性的,它仍然是本地的 .
假设在函数执行结束后函数的作用域仍然存在,这是真的吗?
或者如果不是,那么只有 lists of localy declared variables 被保存在某个地方是真的吗?
我读过有关闭包的内容,但并不完全理解它们 . 对这个问题的回答使得闭包对我来说比以前更加清晰 . 谢谢 .
1 回答
你的功能:
被解释为它是这样编写的:
该函数将始终返回1,因为
foo
始终设置为0
,然后由函数设置为1
. 变量声明被视为发生在函数顶部 .对
doit
的引用是与闭包有关的部分 . 因为该变量在函数外部,所以该函数将在第一次更改它时将其值切换为false . 它可以访问doit
并依赖其值在调用之间保持相同,除非其他东西可以访问doit
并进行更改 .另一方面,变量
foo
是函数的简单局部变量 . 每次调用该函数都会创建一个全新的foo
,并且它与之前的任何foo
都没有任何关系 .