我知道有全局范围,还有可嵌套的功能范围。但是 Javascript 中还有其他类型的作用域或闭包吗?
当我们讨论这个话题时,范围和闭包之间有什么区别?
我知道有全局范围,还有可嵌套的功能范围。但是 Javascript 中还有其他类型的作用域或闭包吗?
当我们讨论这个话题时,范围和闭包之间有什么区别?
闭包是一堆可见范围。假设您有以下代码:
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
toa
并最终分配到f
,它带有这个闭包绑定,所以当你调用f()
,它将可以访问所有这些范围,即使您似乎是在全局范围内调用函数。如您所见,只涉及两种作用域——全局作用域和函数作用域。主要区别在于全局范围内的变量被定义为全局对象的属性,而函数范围 vars不是任何对象的属性,不能以任何其他方式引用,只能通过名称引用。闭包本身不是作用域,而是作用域的集合。