我知道有全局范围,以及可嵌套功能范围。但Javascript中是否有其他类型的范围或闭包?
虽然我们讨论的是主题,但是范围和闭包之间有什么区别?
答案 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
函数的引用返回到调用链时,从b
到a
并最终分配给f
,它会带有这个闭包绑定,所以当您调用f()
,它将可以访问所有这些范围,即使您似乎在全局范围内调用函数。如您所见,只涉及两种范围 - 全局范围和功能范围。主要区别在于全局范围中的变量被定义为全局对象的属性,而函数范围变量是任何对象的不属性,并且不能以任何其他方式引用,而是通过名称引用。闭包本身不是范围,而是范围的集合。