为什么两个相同的函数,return的结果不一样?

FnaticE 2021-01-06 09:57:26
makeCounter这个函数,为什么直接调用它,返回都是0。
而把它赋值给一个变量y,却返回0、1、2,起到了计数的作用?

就赋值这一个动作,能改变函数的返回值?

function makeCounter(){
let count=0;
return function(){
return count++;
};
}

alert(makeCounter()()); // 0
alert(makeCounter()()); // 0
alert(makeCounter()()); // 0

赋值给变量y:
let y=makeCounter();
alert(y()); //0
alert(y()); //1
alert(y()); //2


...全文
4864 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_38832991 2021-01-09
  • 打赏
  • 举报
回复
你需要先去理解 count++ 的执行原理
qybao 2021-01-07
  • 打赏
  • 举报
回复
要理解函数对象
return function(){ //返回值是个函数对象
return count++;
};

所以
let y=makeCounter();//这个函数对象赋给y
alert(y()); //调用的是同一个函数对象


alert(makeCounter()()); //每次都makeCounter()都返回一个新的函数对象
相当于
let a = makeCounter();
let b = makeCounter();
let c = makeCounter();
alert(a()); //a,b,c是不同的函数对象,而上面的y是同一个函数对象
alert(b());
alert(c());
m0_54369894 2021-01-07
  • 打赏
  • 举报
回复
[face]monkey2:001.png[/face]过来了解一下
FnaticE 2021-01-06
  • 打赏
  • 举报
回复
引用 2 楼 天际的海浪 的回复:

这个认真的讲是闭包原理,每调用一次makeCounter()都产生一个闭包环境。
在每个闭包环境中都创建一个独立的 count 变量
alert(makeCounter()()); // 0
alert(makeCounter()()); // 0
alert(makeCounter()()); // 0
这样是调用3次makeCounter()。就创建了3个 count 变量
makeCounter()之后的()是调用返回的function(){return count++;}函数,
函数中操作的count是函数所在闭包环境中 count 变量。
每个函数中操作的count都是不同闭包环境中 count 变量。
也就类似于下面这样
if (true) {
	let count=0;
	alert(count++);
}
if (true) {
	let count=0;
	alert(count++);
}
if (true) {
	let count=0;
	alert(count++);
}


赋值给变量y:
let y=makeCounter();
alert(y());  //0
alert(y());  //1
alert(y());  //2
是只调用1次makeCounter()。只创建1个 count 变量
把返回的function(){return count++;}函数赋值给y,
3次调用y函数中操作的count变量都是同一个。
也就类似于下面这样
if (true) {
	let count=0;
	alert(count++);
	alert(count++);
	alert(count++);
}

还在理解你的内容,先感谢你的详细解答。
天际的海浪 2021-01-06
  • 打赏
  • 举报
回复

这个认真的讲是闭包原理,每调用一次makeCounter()都产生一个闭包环境。
在每个闭包环境中都创建一个独立的 count 变量
alert(makeCounter()()); // 0
alert(makeCounter()()); // 0
alert(makeCounter()()); // 0
这样是调用3次makeCounter()。就创建了3个 count 变量
makeCounter()之后的()是调用返回的function(){return count++;}函数,
函数中操作的count是函数所在闭包环境中 count 变量。
每个函数中操作的count都是不同闭包环境中 count 变量。
也就类似于下面这样
if (true) {
	let count=0;
	alert(count++);
}
if (true) {
	let count=0;
	alert(count++);
}
if (true) {
	let count=0;
	alert(count++);
}


赋值给变量y:
let y=makeCounter();
alert(y());  //0
alert(y());  //1
alert(y());  //2
是只调用1次makeCounter()。只创建1个 count 变量
把返回的function(){return count++;}函数赋值给y,
3次调用y函数中操作的count变量都是同一个。
也就类似于下面这样
if (true) {
	let count=0;
	alert(count++);
	alert(count++);
	alert(count++);
}

87,994

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧