以下解释均为个人理解,有错误之处的话欢迎提出,能给出建议的话万分感激!
定义:
当函数可以记住并访问所在的词法作用域时,就产生了闭包。即使函数是在当前词法作用域之外执行。
例1:
function foo(){
var a=2;
function bar(){
console.log(a);//2
}
bar();
}
foo();
解释:例1产生了闭包吗?发生了,因为bar()的执行访问了在bar函数作用域外的foo作用域的a。虽然这只是基于词法作用域的查找规则,但这些规则是闭包的一部分。
例2:
function foo(){
var a = 2;
function bar(){
console.log(a);//2
}
return bar;
}
var baz = foo();
baz();
解释:例2产生了另一种闭包,即baz()在foo()外部使用了a;因为foo返回bar,故baz相当于bar,即bar在它自己定义的词法作用域(foo作用域)以外的地方执行。一般情况下,函数执行后其作用域会被自动销毁,但是闭包阻止了它,即在foo()执行后baz()仍然可以引用foo()里的a。这种闭包即开头定义的'函数记住并访问所在的词法作用域'。
定义:
当函数可以记住并访问所在的词法作用域时,就产生了闭包。即使函数是在当前词法作用域之外执行。
例1:
function foo(){
var a=2;
function bar(){
console.log(a);//2
}
bar();
}
foo();
解释:例1产生了闭包吗?发生了,因为bar()的执行访问了在bar函数作用域外的foo作用域的a。虽然这只是基于词法作用域的查找规则,但这些规则是闭包的一部分。
例2:
function foo(){
var a = 2;
function bar(){
console.log(a);//2
}
return bar;
}
var baz = foo();
baz();
解释:例2产生了另一种闭包,即baz()在foo()外部使用了a;因为foo返回bar,故baz相当于bar,即bar在它自己定义的词法作用域(foo作用域)以外的地方执行。一般情况下,函数执行后其作用域会被自动销毁,但是闭包阻止了它,即在foo()执行后baz()仍然可以引用foo()里的a。这种闭包即开头定义的'函数记住并访问所在的词法作用域'。
本文通过两个具体例子详细解析了JavaScript中闭包的概念。闭包允许一个函数记住并访问在其定义环境中声明的变量,即使该函数在定义它的作用域之外被调用。

9万+

被折叠的 条评论
为什么被折叠?



