var add = (function () {    var counter = 0;    return function () {return counter += 1;}})();add();add();add();console.log(add())  //结果是4var add = function () {   var counter = 0;   return function () {return counter += 1;}};add()();add()();add()();console.log(add()())  //结果是1
                    
                    
                3 回答
                            cxxyjsj
                            
                                
                            
                        
                        
                                                
                    TA贡献119条经验 获得超22个赞
第一种是闭包的写法. 注意一下第4行最后的(); 程序运行到第4行,实际已经执行了匿名方法,并且把返回值(方法)赋值给add. 因此add每次调用都进行counter++.最终结果为4
第二种就是一个方法定义,每次调用add()时候返回方法,然后再调用返回的方法,这就导致了counter每次都被重新初始化为0. 因此不管执行多少次,结果都是1
                            ruibin
                            
                                
                            
                        
                        
                                                
                    TA贡献358条经验 获得超213个赞
闭包作用域问题,你每调用一次函数就产生一个作用域,第一种方式外层函数被调用一次,并返回一个函数,以后调用这个返回的内层函数,外层函数作用域的变量被保存下来。 第二种方式每次都调用一次外层函数,每次都有不同的作用域,所以每次外层函数的的值都是新的。
添加回答
举报
0/150
	提交
		取消
	