JavaScript词汇范围与变量生命

dku*_*ppi 1 javascript closures scope function

我很好奇为什么会这样:

function doThis(){
    counter = 0;
    return counter;
};

console.log(counter); // returns "reference error: can't find variable"
Run Code Online (Sandbox Code Playgroud)

这是有道理的,因为变量不存在于函数之外.但是如果我创建一个自我执行的函数:

(function doThis(){
    counter = 0;
    return counter;
})();

console.log(counter); // returns 0
Run Code Online (Sandbox Code Playgroud)

为什么变量counter仍然存在?它不是一个闭包,似乎没有任何东西似乎从外部引用这个变量,所以它不应该被垃圾收集破坏吗?

Ric*_*ton 6

您将其创建为全局,因为您没有包含var在变量名称之前.

第一个例子中的函数尚未被调用,因此尚未创建变量,在第二个例子中它已经被创建,这就是为什么你得到的 0

你的代码应该做的是:

function doThis(){
    var counter = 0;
    return counter;
};
Run Code Online (Sandbox Code Playgroud)