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不是已经是函数名了吗?为什么第二个
()
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
返回函数