此代码片段如何执行闭包?

How is this code snippet exercising closure?

提问人:Soumik Sur 提问时间:9/18/2018 更新时间:9/18/2018 访问量:65

问:

我正在阅读 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 范围内的变量名称和选择器被分配参数,并在单击时调用函数激活器,之后函数返回。

在这种情况下,哪个函数对哪个范围有闭包?

JavaScript jQuery 闭包

评论


答:

0赞 Saransh Kataria 9/18/2018 #1

该函数是一个新函数,在单击 selector 元素时被调用。因此,理想情况下,它无法访问 name 变量,因为它未在其作用域中定义。但是,由于它的外部函数包装器,它处于闭包状态,因此它可以访问 name 变量,因此此示例是闭包的一个示例。activator

4赞 Barmar 9/18/2018 #2

该变量被保存在 创建的闭包中name

function activator(){
    console.log( "Activating: " + name );
}

因此,当您单击相应的选择器时,它会记录该名称。

函数中未引用该变量,因此不需要将其保存在闭包中。它只是在 的初始执行期间使用。selectorsetupBot()

每当函数包含使用在函数外部声明的变量,并且函数返回或保存在某个位置(在本例中,它保存在单击事件侦听器中)时,就会创建闭包。

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>