提问人:Soumik Sur 提问时间:9/18/2018 更新时间:9/18/2018 访问量:65
此代码片段如何执行闭包?
How is this code snippet exercising closure?
问:
我正在阅读 getify 的 You don't know JS 系列丛书中关于范围闭包的章节。我觉得我现在了解闭包在表面上是如何工作的,但仍然无法弄清楚这个代码片段是如何执行闭包的。
function setupBot(name,selector) {
$( selector ).click( function activator(){
console.log( "Activating: " + name );
} );
}
setupBot( "Closure Bot 1", "#bot_1" );
setupBot( "Closure Bot 2", "#bot_2" );
我的看法是,在调用函数时,setupbot 范围内的变量名称和选择器被分配参数,并在单击时调用函数激活器,之后函数返回。
在这种情况下,哪个函数对哪个范围有闭包?
答:
0赞
Saransh Kataria
9/18/2018
#1
该函数是一个新函数,在单击 selector 元素时被调用。因此,理想情况下,它无法访问 name 变量,因为它未在其作用域中定义。但是,由于它的外部函数包装器,它处于闭包状态,因此它可以访问 name 变量,因此此示例是闭包的一个示例。activator
4赞
Barmar
9/18/2018
#2
该变量被保存在 创建的闭包中name
function activator(){
console.log( "Activating: " + name );
}
因此,当您单击相应的选择器时,它会记录该名称。
函数中未引用该变量,因此不需要将其保存在闭包中。它只是在 的初始执行期间使用。selector
setupBot()
每当函数包含使用在函数外部声明的变量,并且函数返回或保存在某个位置(在本例中,它保存在单击事件侦听器中)时,就会创建闭包。
function setupBot(name, selector) {
$(selector).click(function activator() {
console.log("Activating: " + name);
});
}
setupBot("Closure Bot 1", "#bot_1");
setupBot("Closure Bot 2", "#bot_2");
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<button id="bot_1">Bot 1</button>
<button id="bot_2">Bot 2</button>
评论