自调用匿名函数闭包内变量的生命周期

lifetime of a variable inside a self invoking anonymous function closures

本文关键字:变量 生命 周期 闭包 调用 函数      更新时间:2023-09-26

我正在学习http://www.w3schools.com/js/js_function_closures.asp的函数闭包

我不明白下面的代码。变量add引用一个自调用的匿名函数,该函数返回一个匿名函数。在这种情况下,变量counter发生了什么?当我们调用add函数时,会发生什么?

<!DOCTYPE html>
<html>
<body>
<p>Counting with a local variable.</p>
<button type="button" onclick="myFunction()">Count!</button>
<p id="demo">0</p>
<script>
var add = (function () {
    var counter = 0;    })();
    return function () {return counter += 1;}

function myFunction(){
    document.getElementById("demo").innerHTML = add();
}
</script>
</body>
</html>

另外我不明白为什么下面的代码不工作?

<!DOCTYPE html>
<html>
<body>
<p>Counting with a local variable.</p>
<button type="button" onclick="myFunction()">Count!</button>
<p id="demo">0</p>
<script>
var add = (function () {
    var counter = 0;
    return function () 
           {
             var semih=0;
             if(counter >5) 
             {
                 return function(){ semih += 5;  }
             }
             return counter += 1;}
           }
)();
function myFunction(){
    document.getElementById("demo").innerHTML = add();
}
</script>
</body>
</html>

在第一个例子中,counter是一个全局变量,因为闭包中的计数器超出了作用域。在第二种情况下,semih不应该在函数中,因为innerHTML接受一个字符串。