函数被调用后,其作用域的剩余部分

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

本文关键字:作用域 剩余部分 调用 函数      更新时间:2023-09-26

我正在处理闭包,我得到了以下代码:

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

doitaww函数仅用于定义/delcare foo一次的变量
当我第一次执行aww时,它将foo作为局部变量进行delcare(并设置为在将来的调用中不声明(,然后将foo赋值为0并将其增加1。并返回(1(

我预计,下次调用aww时,foo变量不会首先声明,因此aww函数应该首先创建foo,并使其成为全局,因为它还没有声明,并且它被分配给0,之前没有任何var。但实际发生的情况与我的预期不同
foo不是全局的,它仍然是本地的。

假设函数的作用域在函数执行结束后仍然存在,这是真的吗
或者,如果不是,那么说只有本地声明变量列表保存在某个地方是真的吗
我读过关于闭包的文章,但并不完全理解它们。这个问题的答案使闭包对我来说比以前更加清晰。Thx。

您的函数:

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都没有关系。