Javascript范围:代码块与具有自执行功能cocoon的代码块

时间:2013-05-08 17:04:23

标签: javascript scope self-executing-function

我正试图围绕范围问题。举两个例子:

A)

var sels = ['.a', '.b', '.c'];
while ( (var sel = fieldsets.shift()) !== undefined ) { 
    (function(sel) {
        $(sel).click(function() {
            console.log(sel);
        });
    })(sel);
}

在此示例中,单击其中一个引用元素时,输出将为.a.b.c

b)中

var sels = ['.a', '.b', '.c'];
while ( (var sel = fieldsets.shift()) !== undefined ) { 
    $(sel).click(function() {
        console.log(sel);
    });
}

在此示例中,点击将生成undefined

我显然误解了这两个示例中范围的应用方式,因为在我看来,在任何一种情况下调用.click时,sel都不再存在。

在这两种情况下应用范围的方式有何不同?

1 个答案:

答案 0 :(得分:3)

关键在于你的陈述:

  

...因为在我看来,在任何一种情况下调用.click时,sel都不再存在。

在像C这样的语言中,这是真的。不是JavaScript!当实例化一个函数时(就像在两个示例中一样创建事件处理程序),它会“捕获”封闭的上下文。执行该函数时,与基于堆栈的语言不同,该上下文仍然可用。 (关闭“关闭”的主题就是我们所说的,你可以在其他地方找到比我在这个简短答案中输入更清晰的解释。)

关键区别在于您的第一个示例引入了一个新图层。在该示例中,每个实例化的事件处理程序有效地获得其自己的私有“sel”变量,该变量是匿名包装函数的参数。由于名称匹配,因此外部“sel”无法访问。

在第二个示例中,因为所有事件处理程序共享访问同一个唯一变量“sel”,所以当它们被调用时它们都看到相同的东西:“sel”的值为它是在循环结束时。该值为undefined,因为那是你的循环停止的时候。