2 louiset louiset 于 2017.08.31 17:27 提问

请问一下js闭包的问题

图片说明

请问为什么要在匿名函数内又创建返回一个闭包函数,而不能直接在匿名函数中返回num??

6个回答

cncots
cncots   2017.08.31 18:01

可以 return 返回的就是函数的执行结果 return function 他的执行结果就是 return num 其实是一样的 为什么不能?

小白一只,如果分析不对,希望有大佬能指正,谢谢啦.

cncots
cncots 回复njueyupeng: 谢谢大佬.闭包这个听烦的,有点绕.
3 个月之前 回复
njueyupeng
njueyupeng 回复cncots: 不一样的,一个会被内存回收掉,另外一个不会,详细见我的答案。希望对你有帮助。
3 个月之前 回复
njueyupeng
njueyupeng   2017.08.31 20:17

在了解闭包的作用之前,要先了解一下 Javascript 中的GC机制:
在 Javascript 中,如果一个对象不再被引用,那么这个对象就会被 GC 回收,否则这个对象一直会保存在内存中。

function A(){

function B(){

console.log("Hello Closure!");

}

return B;

}

var C = A();

C();//Hello Closure!

在上述例子中,B 定义在 A 中,因此 B 依赖于 A ,而外部变量 C 又引用了 B , 所以A间接的被 C 引用。

也就是说,A 不会被 GC 回收,会一直保存在内存中。为了证明我们的推理,上面的例子稍作改进:

function A(){

var count = 0;

function B(){

count ++;

console.log(count);

}

return B;

}

var C = A();

C();// 1

C();// 2

C();// 3

count 是函数A 中的一个变量,它的值在函数B 中被改变,函数B 每执行一次,count 的值就在原来的基础上累加 1 。因此,函数A中的 count 变量会一直保存在内存中。

这是我觉得需要使用闭包而不是直接返回属性的原因。希望对你的理解有帮助。

louiset
louiset 谢谢回答!
3 个月之前 回复
xulanshan33
xulanshan33 那这个的意思就是 那个如果不使用闭包的话,直接return num; 那么那个最外层createFunction函数调用之后,array函数就会被回收。 用了闭包函数之后, 在createFunction执行结束之后,array里面的值是function对象,不会被回收吗? 【没有回收,array存在在哪里呢?】
3 个月之前 回复
playboyanta123
playboyanta123   2017.08.31 18:55

不一样的,如果你直接return num的话数组里面存的就是num,但是function的话数组里面装的就是function,这个function没有被执行,当然调用
某个function的时候才会有返回值,就是对应的num值

m0_38082783
m0_38082783   2017.09.01 13:18

直接返回num:
result = [0,1,2,3,4,5,6,7,8,9];
现在:
result =[
function(){return 0;},
function(){return 1;},
function(){return 2;},
function(){return 3;},
function(){return 4;},
function(){return 5;},
function(){return 6;},
function(){return 7;},
function(){return 8;},
function(){return 9;}
]

 function fun(){
        var res = [];
        for(var i = 0;i < 10; i++){
            res[i] = function(num){
                return function(){
                    return num;
                }();
            }(i)
        }
        return res;
    }
        res = [0,1,2,3,4,5,6,7,8,9];
louiset
louiset 谢谢回答!
3 个月之前 回复
qq_40053130
qq_40053130   2017.09.01 20:26

![图片说明](http://img.ask.csdn.net/upload/201709/01/1504267549_209317.png)图片说明
经过实际测试输出结果为存储了是个10个回调函数的数组,num并未存储进数组内,以下仅供参考
图片说明

                                                            (以上仅为个人观点,不足之处还望指出)
louiset
louiset 谢谢回答! 不过第一个return语句好像漏了分号
3 个月之前 回复
hmszhmsz
hmszhmsz   2017.09.02 21:37

你这里是要返回一个数组的function,而不是一个内部是数字的数组,一个返回[function1,function2,....],一个返回 [0,1,2,.....]

Csdn user default icon
上传中...
上传图片
插入图片