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: 谢谢大佬.闭包这个听烦的,有点绕.
11 个月之前 回复
njueyupeng
njueyupeng 回复cncots: 不一样的,一个会被内存回收掉,另外一个不会,详细见我的答案。希望对你有帮助。
11 个月之前 回复
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 谢谢回答!
11 个月之前 回复
xulanshan33
xulanshan33 那这个的意思就是 那个如果不使用闭包的话,直接return num; 那么那个最外层createFunction函数调用之后,array函数就会被回收。 用了闭包函数之后, 在createFunction执行结束之后,array里面的值是function对象,不会被回收吗? 【没有回收,array存在在哪里呢?】
11 个月之前 回复
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 谢谢回答!
11 个月之前 回复
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语句好像漏了分号
11 个月之前 回复
hmszhmsz
hmszhmsz   2017.09.02 21:37

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

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
谈一谈对JS闭包的理解
个人对前端的一些浅显的理解。
js闭包函数为什么有内存泄漏的问题存在
能导致内存泄漏的一定是引用类型的变量,比如函数和其他自定义对象。而值类型的变量是不存在内存泄漏的,比如字符串、数字、布尔值等。 因为值类型是靠复制来传递的,而引用类型是靠类似c语言中的指针来传递的。 可以认为一个引用类型的变量就是一个指向某个具体的内存地址的指针。 当我们用js代码创建一个引用类型的时候(以下简称对象),js引擎会在内存中开辟一块空间来存放数据,并把指针引用交给那个变量。
大部分人都会做错的经典JS闭包题
目录 1        由工作中演变而来的面试题 2        JS中有几种函数 3        创建函数的几种方式 4        三个fun函数的关系是什么? 5        函数作用域链的问题 6        到底在调用哪个函数? 7        后话 由工作中演变而来的面试题 这是一个我工作当中的遇到的一个问题,似乎很有趣,就当做了一道题去面试,发现几乎没人
JS当中选项卡闭包问题(解决)
作用域当中的变量<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html lang="en"> <head> <meta http-equiv="Content-Type" content="text/html;charset=UTF
剖析js中的闭包,理解闭包到底是个什么,有怎样的作用
闭包的简单剖析,总结出了理解闭包比较清晰简单的方式。
js闭包问题
js的闭包1.变量的作用域 要理解闭包,首先必须理解javascript特殊的变量作用域。 变量的作用域无非就是两种:全局变量和局部变量。 javascript语言的特殊之处,就是在于函数内部可以直接读取全局变量。 举例来说//内部访问全局变量 var n = 999; function f1(){ alert(n); } f1();//999//另一方面,在函数外部无法
js 函数的参数 问题 arguments对象 及闭包
js 参数的传递  是按值传递,在函数内部对变量所做的操作,不会影响到外部的变量。但是如果传递的是复合类型的对象,在内部对其属性所做的操作,则会影响外部对象,这是按址传递。 例如 var a = [1,2,3]; function f(a){ a[0]=4; } f(a); // 结果[4,2,3] alert(a); 如果想要对按值传递的参数在函数内部对其所做的操作
前端面试题——js闭包
什么是闭包?以下代码点击 会输出什么?为什么?能大概说明白的话继续问能想出几种解决办法。 ========== 出错:获取HTML元素集合,循环给元素添加事件。在事件响应函数中(event handler)获取对应的索引。但每次获取的都是最后一次循环的索引。  出错原因:初学者并未理解JavaScript的闭包特性。通过element.onclick=function(){alert(i
JS-闭包详解
闭包是JS中的一块硬骨头-不好啃,需要我们慢慢去咀嚼才能体会出其中的味道,嚼的不好,一不小心还容易崩牙!今天就让我们好好来咀嚼下这块硬骨头把!!! 1.什么是闭包? 所谓闭包:在一个函数作用域中 保留 它上级作用域的局部变量,这些局部变量不会随着上级函数的执行完毕而被销毁(个人理解)。 简单的理解闭包:子函数可以使用父函数的局部变量(包括参数,因为参数也是局部变量);  function
js闭包中this的指向问题及三种解决方法
下面是一个问题,对象方法中定义的子函数,子函数执行时this指向哪里? 三个问题:     (1)以下代码中打印的this是个什么对象?     (2)这段代码能否实现使myNumber.value加1的功能?     (3)在不放弃helper函数的前提下,有哪些修改方法可以实现正确的功能?var myNumber = { value: 1, add: function(i){