在调用函数后,函数的作用范围是什么?

时间:2015-08-21 14:01:01

标签: javascript closures

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

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

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

我希望,下次我致电aww时,foo变量不会先声明,因此aww函数应首先创建foo并使其 global ,因为它尚未声明,并且在它之前没有任何var的情况下被分配给0。但真正发生的事情与我的期望不同。
foo不会成为全球性的,它仍然是本地的。

假设在函数执行结束后函数的作用域仍然存在,这是真的吗? 或者如果没有,是否只保留 localy声明变量列表保存在某处? 我读过有关闭包的内容,但并不完全理解它们。对这个问题的回答使得闭包对我来说比以前更加清晰。 THX。

1 个答案:

答案 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都没有任何关系。