javascript中的闭包混淆
我有这个密码javascript中的闭包混淆,javascript,Javascript,我有这个密码 <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
<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>
使用局部变量计数
计数
0
var add=(函数(){
var计数器=0;
返回函数(){return counter+=1;}
})();
函数myFunction(){
document.getElementById(“demo”).innerHTML=add();
}
变量add被分配自调用函数的返回值
功能
这是否意味着,每次调用add时,只调用函数的返回,而不是调用整个函数
如果没有,谁能解释一下吗?是的,当调用
add()
函数时,只调用IIFE中返回的函数
当解析器在执行阶段遇到IIFE时,会在pageload上调用IIFE,并返回另一个函数作为稍后调用的引用
外部生命所做的唯一事情就是将计数器
变量保持在它自己的范围内
IIFE==是,当调用
add()
函数时,只调用IIFE中返回的函数
当解析器在执行阶段遇到IIFE时,会在pageload上调用IIFE,并返回另一个函数作为稍后调用的引用
外部生命所做的唯一事情就是将计数器
变量保持在它自己的范围内
IIFE==在以下代码中,您有一个返回函数的函数:
var add = (function () {
var counter = 0;
return function () {
return counter += 1;
}
})();
function () {
return counter += 1;
}
外部函数立即执行。因此,add
被分配给内部函数:
var add = (function () {
var counter = 0;
return function () {
return counter += 1;
}
})();
function () {
return counter += 1;
}
如您所见,内部函数中的计数器
变量引用外部函数的上下文(其中声明了计数器
)。此上下文称为closure
,仍在内部函数中引用。因此,JavaScript使这个上下文保持活动状态
正如@RobG所指出的,内部JavaScript执行规则更像是:内部函数中的标识符计数器
首先在内部执行上下文中解析。因为在那里找不到,所以会搜索作用域链上的下一个对象,即外部执行上下文,并在那里找到计数器
因此,借助闭包的魔力,计数器
变量仍然可以在调用内部函数时访问和更改(使用add
)
因此,当调用add
时,您正在执行内部函数,该函数在计数器上关闭,在以下代码中,您有一个函数返回一个函数:
var add = (function () {
var counter = 0;
return function () {
return counter += 1;
}
})();
function () {
return counter += 1;
}
外部函数立即执行。因此,add
被分配给内部函数:
var add = (function () {
var counter = 0;
return function () {
return counter += 1;
}
})();
function () {
return counter += 1;
}
如您所见,内部函数中的计数器
变量引用外部函数的上下文(其中声明了计数器
)。此上下文称为closure
,仍在内部函数中引用。因此,JavaScript使这个上下文保持活动状态
正如@RobG所指出的,内部JavaScript执行规则更像是:内部函数中的标识符计数器
首先在内部执行上下文中解析。因为在那里找不到,所以会搜索作用域链上的下一个对象,即外部执行上下文,并在那里找到计数器
因此,借助闭包的魔力,计数器
变量仍然可以在调用内部函数时访问和更改(使用add
)
因此,当调用add
时,您正在执行内部函数,该函数在计数器上关闭
为什么代码不是从函数的第一个语句开始执行,而是直接跳转返回。请您给我一些解释。外部函数是一个生命,当解析器遇到它时,会立即调用它,并返回结果,在本例中,这是另一个函数。我认为我链接到的wikipedia页面对此进行了很好的解释。是的,当调用add()函数时,只调用IIFE中返回的函数。在这个语句中,当你说return时,调用了。return是外部函数而不是内部函数。对吗?实际上不是“当解析器遇到它时”,而是稍后,在执行阶段为什么代码不是从函数的第一条语句开始执行,而是直接跳转返回。请您给我一些解释。外部函数是一个IIFE,当解析器遇到它时会立即调用它,并返回结果,在本例中,这是另一个函数。我想我链接到的wikipedia页面对此进行了很好的解释。是的,当调用add()函数时,只调用IIFE中返回的函数。在这个语句中,当你说return时,调用了。return是外部函数而不是内部函数。对吗?实际上不是“当解析器遇到它时”,而是稍后,在执行阶段更广泛的解释可能是:“首先在内部执行上下文中解析内部函数中的标识符计数器。因为在那里找不到它,所以搜索范围链上的下一个对象,即外部执行上下文,在那里找到计数器”。但也许那只是我@这是一个更广泛的解释。我已经把它添加到了答案中。thx.更广泛的解释可能是:“内部函数中的标识符计数器首先在内部执行上下文中解析。因为在那里找不到它,所以搜索作用域链上的下一个对象,即外部执行上下文,在那里找到计数器”。但也许那只是我@这是一个更广泛的解释。我已经把它添加到了答案中。谢谢。