这对JavaScript函数有何不同?
我很难辨别JavaScript闭包到底是如何工作的。请看一下这两个函数,并说明它们的不同之处,即它们在多次调用时会产生完全不同的结果: 职能1这对JavaScript函数有何不同?,javascript,lexical-closures,Javascript,Lexical Closures,我很难辨别JavaScript闭包到底是如何工作的。请看一下这两个函数,并说明它们的不同之处,即它们在多次调用时会产生完全不同的结果: 职能1 var add=(函数(){ var计数器=0; 返回函数(){ 返回计数器+=1; } })(); console.log(add());//结果是1 console.log(add());//结果是2 console.log(add());//结果是3您无法访问该机柜外部机柜内定义的任何变量。这有助于避免冲突,例如多个函数使用相同的变量名 在案例1
var add=(函数(){
var计数器=0;
返回函数(){
返回计数器+=1;
}
})();
console.log(add());//结果是1
console.log(add());//结果是2
console.log(add());//结果是3
您无法访问该机柜外部机柜内定义的任何变量。这有助于避免冲突,例如多个函数使用相同的变量名 在案例1中,您返回的函数在外部iLife上具有闭包。因此,返回的函数能够存储count的值,即使它已经返回(即闭包),因此每次调用add()
你的案例2似乎不正确。您没有定义plus
函数。即使您定义了它,您也会得到未定义的
,因为您没有从add()
函数添加(){
var计数器=0;
函数加号(){
返回计数器+=1;
}
加();
}
console.log(add());//结果是1
console.log(add());//结果是1
console.log(add());//结果是1在第一个示例中,声明了计数器,调用add
时调用的函数本质上是:
function (){
return counter += 1;
}
这很重要,因为不是每次调用add
时都重新声明计数器
在第二个示例中,每次调用add
时都会重新声明计数器
这对JavaScript函数有何不同
在每个示例中,您都声明了两个函数,一个嵌套在另一个函数中
在第一个示例中,调用外部函数一次,返回内部函数并将其分配给add
。这意味着调用add
将只执行内部函数
在第二个示例中,add
引用外部函数。因此,调用add
将始终执行外部和内部函数
如果我们稍微重写第一个示例(它仍然产生相同的结果),您可能会更好地看到差异:
注意add
如何只调用一次,这意味着var counter=0
只执行一次,而plus
是我们实际调用的函数。由于plus
是在add
中定义的,因此它可以访问计数器
在第一个示例中,外部函数运行一次,将计数器变量设置为零。外部函数返回内部函数,并将其分配给变量add
。调用add()
时,内部函数在声明它的上下文中运行,因此它可以递增计数器变量
在第二个示例中,使用名称add
声明外部函数。每次调用add
时,都会运行此外部函数。这个外部函数每次都将计数器设置为零,然后运行内部的plus
函数,该函数将计数器递增为1并返回它。下面是第一个代码段中的具体情况
var add = (function() {
var counter = 0;
return function() {
return counter += 1;
}
})();
在上面的语句中,您为变量add
分配了一个函数,该函数增加了计数器
注意事项:
您可以通过执行一个enclosure函数来获得此函数。(请注意存储模块函数返回的内容)
您可以通过将()
放在存储模块的后面来执行存储模块功能
现在变量add
是一个只增加计数器的函数。在这里,环境被设置为进行闭包-因此内部函数始终记住计数器先前的值
因此,每次通过add
变量执行内部函数时,都会看到增加的数字。在第二个示例中,每次调用add()
时,计数器的值设置为0
第二个示例实际上无效。我猜你的意思是函数plus(){}
?@FelixKling,然后返回plus()代码>以及…@Aditya–让OP在代码中进行这些更改..此编辑将更改代码的含义,这里的解释是正确的,这是一个疏忽,所以你是说函数1的计数器没有在每次调用时重新声明?这怎么可能?因为我在某处了解到,无论何时调用函数,都会创建一个新的执行上下文。两者之间的区别标记到底是什么two@pedroyanky:包含var计数器的函数=0代码>只执行一次。内部函数(returnfunction(){…}
)是“每次”调用add()
时调用的函数。示例之间的区别在于第一个示例执行var add=(function(){…}())
,而第二个示例执行var add=function(){}代码>。第一个执行外部函数一次,第二个“每次”执行外部函数。“因为我在某个地方了解到,每当调用函数时,都会创建一个新的执行上下文。”这就是为什么在第二种情况下,计数器
会被重置的原因。谢谢。我现在理解的是计数器的值存储在变量add中。由于匿名函数存储在变量中,因此可以安全地说,每当调用该函数时,变量add都会收到计数器的更新版本吗?计数器不存储在变量中,而是存储在函数中。每当函数运行时,它仍然可以访问声明时它可以访问的所有内容,包括
var add = (function() {
var counter = 0;
return function() {
return counter += 1;
}
})();