猿问

请大神解释下,为什么执行结果会不一样?

var add = (function () {
   var counter = 0;
   return function () {return counter += 1;}
})();

add();
add();
add();
console.log(add())  //结果是4



var add = function () {
   var counter = 0;
   return function () {return counter += 1;}
};

add()();
add()();
add()();
console.log(add()())  //结果是1

慕田峪8701529
浏览 2035回答 3
3回答

cxxyjsj

第一种是闭包的写法. 注意一下第4行最后的();  程序运行到第4行,实际已经执行了匿名方法,并且把返回值(方法)赋值给add. 因此add每次调用都进行counter++.最终结果为4第二种就是一个方法定义,每次调用add()时候返回方法,然后再调用返回的方法,这就导致了counter每次都被重新初始化为0. 因此不管执行多少次,结果都是1

ruibin

闭包作用域问题,你每调用一次函数就产生一个作用域,第一种方式外层函数被调用一次,并返回一个函数,以后调用这个返回的内层函数,外层函数作用域的变量被保存下来。 第二种方式每次都调用一次外层函数,每次都有不同的作用域,所以每次外层函数的的值都是新的。
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答