Javascript中存在哪些类型的范围?

时间:2012-09-22 11:39:03

标签: javascript scope closures lexical-scope

我知道有全局范围,以及可嵌套功能范围。但Javascript中是否有其他类型的范围或闭包?

虽然我们讨论的是主题,但是范围和闭包之间有什么区别?

1 个答案:

答案 0 :(得分:1)

闭包是一堆可见范围。假设您有以下代码:

var v1;
function a() {
    var v2;
    function b() {
        var v3;
        function c() {
            var v4;
        }
        return c;
    }
    return b();
}
var f = a();

c是一个具有4个可见范围的函数:它自己的范围(其中定义了v4),b函数的范围(其中v3被定义), a函数的作用域(其中定义了v2)和全局作用域(其中定义了v1)。该堆可见范围是闭包,函数绑定到该闭包。当c函数的引用返回到调用链时,从ba并最终分配给f,它会带有这个闭包绑定,所以当您调用f(),它将可以访问所有这些范围,即使您似乎在全局范围内调用函数。如您所见,只涉及两种范围 - 全局范围和功能范围。主要区别在于全局范围中的变量被定义为全局对象的属性,而函数范围变量是任何对象的属性,并且不能以任何其他方式引用,而是通过名称引用。闭包本身不是范围,而是范围的集合。