Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/401.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么这两个函数有不同的结果?(对不起,我不知道如何描述它们)_Javascript_Iife - Fatal编程技术网

Javascript 为什么这两个函数有不同的结果?(对不起,我不知道如何描述它们)

Javascript 为什么这两个函数有不同的结果?(对不起,我不知道如何描述它们),javascript,iife,Javascript,Iife,我有两个问题 counter1()和counter1()()之间有什么区别? 计数器1不是已经是函数名了吗?为什么第二个() 为什么计数器2可以记住该值 这是我的密码: const counter1 = function(){ let initValue = 0 return function(){ initValue++; return initValue } } const counter2 = (function(){ let initValue =

我有两个问题

  • counter1()
    counter1()()
    之间有什么区别?
    计数器1不是已经是函数名了吗?为什么第二个
    ()

  • 为什么计数器2可以记住该值

  • 这是我的密码:

    const counter1 = function(){
      let initValue = 0
      return function(){
        initValue++;
        return initValue
      }
    }
    
    const counter2 = (function(){
      let initValue = 0
      return function(){
        initValue++;
        return initValue
      }
    })()
    
    console.log(counter1());
    console.log(counter1()());
    console.log(counter1()());
    console.log(counter2());
    console.log(counter2());
    
    以下是输出结果


    计数器1
    是一个返回函数的函数,或者称为

    为了便于讨论,让
    innerCounter1
    作为
    counter1
    的返回值的名称。因此,下面的代码与示例中的代码相同

     const counter1 = function(){
       let initValue = 0
       const innerCounter1 = function(){
         initValue++;
         return initValue
       }
       return innerCounter1;
     }
    
    计数器1不是已经是函数名了吗?为什么是第二个()

    是的,
    counter1
    是一个函数,但它也返回一个函数。通过命名返回值
    innerCounter1
    ,我希望在调用
    counter1()
    时,得到的值是
    innerCounter1
    。调用
    innerCounter1()
    时,得到的值是数字
    initValue
    。因此,
    counter1()()
    正在获取
    innerCounter1
    的值,并在一个短表达式中调用该内部函数

    为什么计数器2可以记住该值

    创建函数时(示例中为
    innerCounter1
    ),函数引用函数外部定义的值(示例中为
    initValue
    ),将创建一个变量,您可以直观地理解为“记忆”变量。函数
    counter1()
    counter2
    都会记住该值,但这里要注意的是每次调用
    counter1()
    ,局部变量(
    initValue
    innerCounter1
    )都是独立的。例如:

    let counter1A = counter1();
    let counter1B = counter1();
    
    counter1A(); // 1
    counter1A(); // 2
    counter1B(); // 1
    counter1B(); // 2
    
    换句话说,
    counter1A
    counter1B
    正在记住一个单独的
    initValue
    变量,因此调用一个变量不会影响另一个变量


    counter2
    的这个定义是:
    让counter2=counter1()
    与您上面的匿名函数语法相同,因此应该清楚的是,发生的事情与我上面解释的
    counter1A
    完全相同。

    counter1
    是一个返回函数的函数,或者称为

    为了便于讨论,让
    innerCounter1
    作为
    counter1
    的返回值的名称。因此,下面的代码与示例中的代码相同

     const counter1 = function(){
       let initValue = 0
       const innerCounter1 = function(){
         initValue++;
         return initValue
       }
       return innerCounter1;
     }
    
    计数器1不是已经是函数名了吗?为什么是第二个()

    是的,
    counter1
    是一个函数,但它也返回一个函数。通过命名返回值
    innerCounter1
    ,我希望在调用
    counter1()
    时,得到的值是
    innerCounter1
    。调用
    innerCounter1()
    时,得到的值是数字
    initValue
    。因此,
    counter1()()
    正在获取
    innerCounter1
    的值,并在一个短表达式中调用该内部函数

    为什么计数器2可以记住该值

    创建函数时(示例中为
    innerCounter1
    ),函数引用函数外部定义的值(示例中为
    initValue
    ),将创建一个变量,您可以直观地理解为“记忆”变量。函数
    counter1()
    counter2
    都会记住该值,但这里要注意的是每次调用
    counter1()
    ,局部变量(
    initValue
    innerCounter1
    )都是独立的。例如:

    let counter1A = counter1();
    let counter1B = counter1();
    
    counter1A(); // 1
    counter1A(); // 2
    counter1B(); // 1
    counter1B(); // 2
    
    换句话说,
    counter1A
    counter1B
    正在记住一个单独的
    initValue
    变量,因此调用一个变量不会影响另一个变量


    counter2
    的这个定义是:
    让counter2=counter1()
    ,相当于您上面的匿名函数语法,因此应该很清楚发生的事情与我上面解释的
    counter1A
    完全相同。

    JS
    中,您可以从
    函数
    返回一个函数,然后可以在任何地方使用它,另外:返回的函数仍然可以访问定义它的变量(可以访问它的词法范围变量)。这个特性称为闭包

    请仔细阅读带有代码的注释

    const counter1=函数(){
    设initValue=0
    返回函数(){
    initValue++;
    返回初始值
    }
    }
    /**
    *与
    */
    函数计数器1(){
    设initValue=0
    /**返回此函数*/
    返回函数(){
    /** 
    *并且可以在运行时访问变量'initValue',因为在身份验证时它的作用域在内部
    *中定义变量的“counter1”作用域
    *(因为内部作用域可以访问其中定义的外部作用域)
    * 
    */
    initValue++;
    返回初始值
    }
    }
    /**
    *至于使用计数器1
    *每次调用'counter1'时,我们都会得到一个对内部匿名函数的引用,该函数具有
    *访问该变量,但在每次调用中,我们都有新的'initValue'变量,这就是原因
    *无论你打多少次“counter1”,你都会得到相同的结果,因为你有新的
    *每次调用的“initValue”
    */
    常量计数器2=(函数(){
    设initValue=0
    返回函数(){
    initValue++;
    返回初始值
    }
    })()
    /**
    *这种定义函数并立即执行它的形式称为IIEF(立即调用的函数表达式)
    * 
    *这段代码执行的是计数器2,它等于从外部函数表达式返回的内部函数
    * 
    */
    //命名匿名函数以简化
    常量计数器2=(函数IIFE_计数器2(){
    设initValue=0
    返回函数