function test1(){
var i ={name:’nyf’};
}
function test2(){
var i ={name:’nyf’};
return i;
}
var m1 = test1();
var m2 = test2();
这样的话局部变量i没有释放,算不算构成闭包,为什么?
巴扎黑2017-04-10 16:51:12
楼主的例子当然不算闭包,因为这两个函数执行完之后作用域的“引用”就“销毁”(准备被垃圾回收了)。
function test1(){
var i ={name:"nyf"};//执行完成后i就会"销毁"掉
}
function test2(){
var i ={name:"nyf"};
return i; //执行完成后i就会"销毁"掉,而i会存在返回的结果载体里
}
var m1 = test1();//undefined
var m2 = test2();//Object{name:"nyf"}
闭包的例子
function test3(){
var i ={name:"nyf"};
return {
get:()=>i
, set:name=>i.name=name
// 等同于function(name){ return i.name=name; }
}
}
var m3 = test3() //这样test3的作用域并没被消除,他的局部变量被返回结果的匿名函数引用了
console.log(m3.get());//Object{name:"nyf"}
m3.set("da shui bi")
console.log(m3.get());//Object{name:"da shui bi"};
怪我咯2017-04-10 16:51:12
function test1(){
var i ={name:’nyf’};
}
function test2(){
var i ={name:’nyf’};
return i;
}
var m1 = test1();
var m2 = test2();
以上2个都不算是闭包
1) 在一个函数内声明了另一个内部函数才有可能形成闭包
2)如果声明的函数没有使用其外层函数的变量,那么不能形成闭包,如果引用到就会形成闭包
如下,没有闭包形成
function test1(){
var i ={name:’nyf’};
return function(){
console.log('~hello world~');
}
}
test1/test2没有声明过内部函数,就不具备形成闭包的必须条件
如下,就会有闭包形成
function test1(){
var i ={name:’nyf’};
return function(){
console.log('name:%s',i.name);
}
}
或
function test1(){
var i ={name:’nyf’};
return {
address:'addr',
getUnserInfo:function(){
console.log('name:%s,address:%s',i.name,this.address);
}
}
}
或
function test1(){
var i ={name:’nyf’};
function getUnserInfo(){
console.log('name:%s',i.name);
}
}
闭包形成的是一个函数的作用域链,一个函数A内需要访问其外层函数定义的变量,就会形成函数A的闭包,这是一个静态的概念,在函数声明的时候就形成~~~~
PHP中文网2017-04-10 16:51:12
不算,因为m2不能访问到test2()内部的作用域。只是单纯引用了i,然后这个test2()里的i就被销毁了。
function test3(){
var i = {name:'nyf'};
return function(){
return i;
}
}
m3 = test3();
这样m3就是等于引用了一个匿名函数,可以通过m3()来得到返回的i值,到这步才算是闭包。
因为这个函数被引用着,所以test3的作用域没有被销毁。
巴扎黑2017-04-10 16:51:12
闭包闭包,首先要被包起来。
用什么来包?
Javascript只有六种数据类型,function
和object
似乎都能实现包起来的要求(复杂的数据组合)。
其次,所谓的闭,就是作用域,变量只在封闭的范围内有效。
那么只剩下function
能实现了,因为只有function
才有作用域的概念。
但显然并非所有的function
都可以称为闭包
。
我们知道,JS
中的function
能够访问它们的:
参数;
局部变量或函数(它自己内部定义的);
外部变量,包括
3.1 全局变量(DOM,window等)。
3.2 外部函数的变量或函数。
如果一个函数访问了它的外部变量,那么它就是一个闭包。
从技术上来讲,在JS中,每个function都可能是闭包,因为它总是能访问在它外部定义的数据。
http://kb.cnblogs.com/page/110782/