Javascript 这个代码段是如何实现闭包的?

Javascript 这个代码段是如何实现闭包的?,javascript,jquery,closures,Javascript,Jquery,Closures,我正在阅读getify的《你不知道JS》系列丛书中关于范围关闭的章节。我觉得现在我理解了闭包在表面上是如何工作的,但仍然无法理解这个代码段是如何实现闭包的 function setupBot(name,selector) { $( selector ).click( function activator(){ console.log( "Activating: " + name ); } ); } setupBot( "Closure Bot 1", "#bot

我正在阅读getify的《你不知道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范围内的变量名称和选择器被分配参数,函数activator被调用,单击后函数返回


在本例中,哪个函数在哪个作用域上具有闭包?

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

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

function activator(){
    console.log( "Activating: " + name );
}
因此,当您单击相应的选择器时,它会记录该名称

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

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

功能设置机器人(名称、选择器){
$(选择器)。单击(函数激活器(){
console.log(“激活:+名称”);
});
}
setupBot(“关闭Bot 1”,“关闭Bot 1”);
setupBot(“关闭Bot 2”,“关闭Bot 2”)

机器人1
机器人2