调用函数后,函数的范围还剩下什么?

what will remain of scope of a function after it has been called?

我正在使用闭包,我得到了这段代码:

doit = true;
aww = function() {
    if(doit) {var foo; doit = false;} else {}
    foo = 0; foo += 1; return foo;
}

doit 是一个变量,aww 函数仅使用 define/delcare foo 一次。
当我第一次执行 aww 时,它将 delcares foo 作为局部变量(并设置为在以后的调用中不声明它)然后它将 foo 分配给 0 并将其增加 1。并且 returns 它 (1)

我预计,下次我调用 aww 时,不会先声明 foo 变量,因此 aww 函数应该首先创建 foo 并创建它global,因为它还没有被声明,并且它被赋值给 0,前面没有任何 var。但是实际发生的事情和我的预料不一样
foo没有变成全局的,还是局部的。

假设函数的作用域在函数执行结束后仍然存在是真的吗?
或者,如果不是,那么说只有 本地声明的变量列表 保存在某处是真的吗?
我读过有关闭包的内容,但并不完全理解它们。这个问题的答案让我比以前更清楚闭包。谢谢

你的函数:

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;
}

函数总是return 1,因为foo总是被函数设置为0然后1。变量声明被视为发生在函数的顶部。

doit的引用是其中与闭包有关的部分。因为该变量在函数外部,所以函数会在第一次调用时将其值切换为 false,然后不会再更改它。它 可以 访问 doit 并依赖于它的值在调用之间保持不变,除非其他东西可以访问 doit 并进行更改。

另一方面,变量 foo 是函数的简单局部变量。每次调用该函数都会创建一个全新的 foo,并且该函数与之前的任何 foo 都没有关系。