Javascript 为什么一个计数器工作而另一个不工作';T(关闭?)

Javascript 为什么一个计数器工作而另一个不工作';T(关闭?),javascript,Javascript,关于这个反例,我有两个问题 为什么addVersionOne不起作用?为什么它返回的是实际代码而不是数字 addVersionTwo如何工作?每次运行函数时,计数器不是被重置回0 const addVersionOne=function(){ 设计数器=0; 返回函数(){ 计数器+=1; 返回计数器; } } var addVersionTwo=(函数(){ 设计数器=0; 返回函数(){ 计数器+=1; 返回计数器; } })(); 函数writeVersionOne(){ documen

关于这个反例,我有两个问题

  • 为什么addVersionOne不起作用?为什么它返回的是实际代码而不是数字
  • addVersionTwo如何工作?每次运行函数时,
    计数器
    不是被重置回
    0
  • const addVersionOne=function(){
    设计数器=0;
    返回函数(){
    计数器+=1;
    返回计数器;
    }
    }
    var addVersionTwo=(函数(){
    设计数器=0;
    返回函数(){
    计数器+=1;
    返回计数器;
    }
    })();
    函数writeVersionOne(){
    document.getElementById(“addVersionOne”).innerHTML=addVersionOne();
    }
    函数writeVersionTwo(){
    document.getElementById(“addVersionTwo”).innerHTML=addVersionTwo();
    }
    
    页面标题
    阿德维松
    addVersionTwo
    

    0

    0


    因为函数addVersionOne的返回值是一个函数,而且很明显。但是addVersionTwo函数实际上是返回函数的函数调用的结果。因此,addVersionTwo实际上是下面的函数:

    return function() {
        counter += 1; 
        return counter;
    }
    
    您可以按如下方式定义函数addVersionTwo:

    var counter = 0;
    
    var addVersionTwo = function() {
        counter += 1; 
        return counter;
    };
    
    执行此操作时:

    addVersionOne()
    
    结果如何?好,让我们看看这个函数返回什么:

    //...
    return function() {
        counter += 1;
        return counter;
    }
    
    它返回一个函数。该函数从未执行,只是返回。函数本身被设置为目标元素的
    innerHTML

    但这又有什么回报呢

    addVersionTwo()
    
    请注意,第二个版本如何将所有内容包装在括号中,然后添加另一组括号以调用返回的函数。因此,虽然变量
    addVersionOne
    是返回函数的函数,但变量
    addVersionTwo
    是返回的函数。它返回一个值:

    //...
    return counter;
    

    不是每次函数运行时计数器都被重置回0吗

    你指的是哪个“功能”?你有几个。此函数在页面加载时执行一次:

    function () {
        let counter = 0;
        return function() {
            counter += 1; 
            return counter;
        }
    }
    
    然后返回存储在
    addVersionTwo
    变量中的函数。该职能是:

    function() {
        counter += 1; 
        return counter;
    }
    

    不,该函数不会在每次执行时将计数器重置为0,因为第二个函数执行外部函数,而第一个函数是外部函数……第二个函数是IIFE->“立即调用函数表达式”。搜索该术语并进行一些阅读当您使用
    let
    时,它将不会重新声明变量。请检查此答案以获得澄清@ZainAftab:这在本文中是不正确的。在这里使用
    let
    var
    没有区别。