从技术讲,所有的javascript函数都闭包,他们都是对象,它们都关联到作用域链,定义大多数函数时的作用域链在调用函数时依然有效,但这并不影响闭包,当调用后函数是闭包所指向的作用域链和定义函数时的作用域链不是同一个作用域链
var scope = "global scope";
function checkscope(){
var scope = "local scope"
function f(){return scope;}
return f();
}
checkscope() //local scope
------------------------
var scope = "global scope";
function checkscope(){
var scope = "local scope"
function f(){return scope;}
return f;
}
4checkscope()() //local scope
这段代码是将函数内的一对圆括号移动到了checkscope()之后,checkscope()现在仅仅返回函数内嵌套的一个函数对象,而不是直接返回结果
js函数的执行用到了作用域链,这个作用域链是函数定义的时候创建的.嵌套的函数f()定义在这个作用域链里,其中的变量scope一定是局部变量,不管在何时何地执行函数f(),这种绑定在执行f()时依然有效,因此最后返回的依然是local scope
每次调用javascript函数的时候,都会为之创建一个新的对象用来保存局部变量,把这个对象添加值作用域链中,当函数返回的时候,就从作用域链中将这个绑定变量的对象删除.如果不存在嵌套函数,也没有其他引用指向这个绑定对象,它就会被当做垃圾回收.
如果定义了嵌套的函数,每个嵌套的函数都都对应一个作用域链,并且这个作用域链指向一个变量绑定对象.但如果这些嵌套的函数对象在外部函数中保留下来
闭包的特性:可以捕捉到局部变量(和参数),并一直保存下来,那么它们也会和所指向的变量绑定对象一样当做垃圾回收.,但是如果这个函数定义了嵌套的函数并将它作为返回值返回或嵌套在函数的属性里这时就会有一个外部引用指向这个嵌套的函数.它就不会被当做垃圾回收,并且它所指向的变量绑定对像也不会被当做垃圾回收
var scope = "global scope";
function checkscope(){
var scope = "local scope"
function f(){return scope;}
return f();
}
checkscope() //local scope
------------------------
var scope = "global scope";
function checkscope(){
var scope = "local scope"
function f(){return scope;}
return f;
}
4checkscope()() //local scope
这段代码是将函数内的一对圆括号移动到了checkscope()之后,checkscope()现在仅仅返回函数内嵌套的一个函数对象,而不是直接返回结果
js函数的执行用到了作用域链,这个作用域链是函数定义的时候创建的.嵌套的函数f()定义在这个作用域链里,其中的变量scope一定是局部变量,不管在何时何地执行函数f(),这种绑定在执行f()时依然有效,因此最后返回的依然是local scope
每次调用javascript函数的时候,都会为之创建一个新的对象用来保存局部变量,把这个对象添加值作用域链中,当函数返回的时候,就从作用域链中将这个绑定变量的对象删除.如果不存在嵌套函数,也没有其他引用指向这个绑定对象,它就会被当做垃圾回收.
如果定义了嵌套的函数,每个嵌套的函数都都对应一个作用域链,并且这个作用域链指向一个变量绑定对象.但如果这些嵌套的函数对象在外部函数中保留下来
闭包的特性:可以捕捉到局部变量(和参数),并一直保存下来,那么它们也会和所指向的变量绑定对象一样当做垃圾回收.,但是如果这个函数定义了嵌套的函数并将它作为返回值返回或嵌套在函数的属性里这时就会有一个外部引用指向这个嵌套的函数.它就不会被当做垃圾回收,并且它所指向的变量绑定对像也不会被当做垃圾回收