【发布时间】:2012-09-14 15:15:22
【问题描述】:
我知道有 全局范围, 以及另外 可嵌套的功能范围。但是 Javascript 中还有其他类型的作用域或闭包吗?
当我们谈到这个话题时,作用域和闭包之间有什么区别?
【问题讨论】:
标签: javascript scope closures lexical-scope
我知道有 全局范围, 以及另外 可嵌套的功能范围。但是 Javascript 中还有其他类型的作用域或闭包吗?
当我们谈到这个话题时,作用域和闭包之间有什么区别?
【问题讨论】:
标签: javascript scope closures lexical-scope
闭包是一堆可见范围。假设您有以下代码:
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()时,它会可以访问所有这些范围,即使您似乎是在全局范围内调用函数。如您所见,只涉及两种作用域——全局作用域和函数作用域。主要区别在于全局作用域中的变量被定义为全局对象的属性,而函数作用域变量是任何对象的不是属性,不能以任何其他方式引用,只能通过名称引用。闭包本身不是作用域,而是作用域的集合。
【讨论】:
window还有其他类型的作用域吗?
postmessage serializes 传递的对象,序列化算法无法序列化函数。将该对象传递给iframeWin.postmessage 将导致DATA_CLONE_ERR 异常。
eval-ing 包含定义函数的代码的字符串将愉快地定义函数,无论该字符串来自何处。