【问题标题】:How is this code snippet exercising closure?这个代码片段是如何执行闭包的?
【发布时间】:2019-02-22 07:19:17
【问题描述】:

我正在阅读 getify 的 You don't know JS book series 中关于 Scope Closure 的章节。我觉得我现在明白了闭包在表面上是如何工作的,但仍然无法弄清楚这段代码 sn-p 是如何执行闭包的。

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 closures


    【解决方案1】:

    name 变量保存在由

    创建的闭包中
    function activator(){
        console.log( "Activating: " + name );
    }
    

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

    selector 变量在函数中没有被引用,所以它不需要保存在闭包中。它只是在setupBot() 的初始执行期间使用。

    每当函数包含使用在函数外部声明的变量时,就会创建一个闭包,并且该函数被返回或保存在某个地方(在这种情况下,它保存在 click 事件侦听器中)。

    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>

    【讨论】:

      【解决方案2】:

      activator 函数是一个新函数,当单击选择器元素时会调用它。所以理想情况下,它不会访问 name 变量,因为它没有在其范围内定义。但是由于它的外部函数包装,它在一个闭包中,它可以访问 name 变量,因此这个示例是一个闭包的示例。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-12-11
        • 2011-05-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-15
        • 1970-01-01
        • 2015-03-12
        相关资源
        最近更新 更多