Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.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 - Fatal编程技术网

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.更广泛的解释可能是:“内部函数中的标识符计数器首先在内部执行上下文中解析。因为在那里找不到它,所以搜索作用域链上的下一个对象,即外部执行上下文,在那里找到计数器”。但也许那只是我@这是一个更广泛的解释。我已经把它添加到了答案中。谢谢。