HarmonyOS鸿蒙Next ArkTs语法介绍→语法进阶关于闭包函数代码的错误
HarmonyOS鸿蒙Next ArkTs语法介绍→语法进阶关于闭包函数代码的错误 视频课里面的打印内容应该是调用counter()(图三)而非createCounter()(图一)。也可写成中间图形式的闭包函数
(我是初学者,别喷我\(^ω^\))



更多关于HarmonyOS鸿蒙Next ArkTs语法介绍→语法进阶关于闭包函数代码的错误的实战教程也可以访问 https://www.itying.com/category-93-b0.html
你的判断是对的。const counter = createCounter() 后,闭包状态保存在 counter 这个返回函数里;要连续累加,后面应该调用 counter()。
如果每次都写 createCounter(),就会重新创建一个新的闭包,里面的 count 也重新从初始值开始,这就不是示例想表达的“内部函数记住外部变量”。建议课程示例修成:先 const counter = createCounter(),再连续 console.log(counter()),这样才对应 1、2、3 的结果。可以在课程评论或反馈工单里提一下。
更多关于HarmonyOS鸿蒙Next ArkTs语法介绍→语法进阶关于闭包函数代码的错误的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
说得对,课程里的代码示例确实写错了。
问题核心就在这里:
错误写法:
const counter = createCounter();
console.log(`${createCounter()}`); // 1
console.log(`${createCounter()}`); // 2
console.log(`${createCounter()}`); // 3
这里每次调用:
createCounter()
都会:
重新创建一个新的闭包
也就是说:
let count = 0
每次都会重新初始化。
所以真实结果其实不是:
1 2 3
而应该是:
1 1 1
因为每次都是新的 counter。闭包本质就是“内部函数记住外部变量”。
正确写法应该是:
function createCounter() {
let count = 0;
return () => {
count++;
return count;
};
}
const counter = createCounter();
console.log(counter()); // 1
console.log(counter()); // 2
console.log(counter()); // 3
这里:
const counter = createCounter();
只执行一次。
因此:
count 被闭包保存下来了
后续调用:
counter()
操作的是同一个 count。
你图里下面那个“中间图形式”其实才是正确的闭包示例。
所以不是你理解错了,而是:
教程里的打印代码确实有问题。
很多 JS/ArkTS 初学教程都会犯这个错误,把:
createCounter()
和:
counter()
混用了。
前者:
创建闭包
后者:
执行闭包
这是两回事。
可以在课程评论里回复下,或者工单提一下。

在 ArkTS 中,闭包函数常见错误:1)捕获变量时未使用 @State 或 @Prop 修饰,导致状态不更新;2)闭包中引用 this 未用箭头函数,导致作用域丢失;3)闭包内修改外部 let 变量时未考虑生命周期,在异步任务中产生意外值。检查变量声明和回调写法即可。
你的观察是正确的。
createCounter() 是一个返回闭包函数的工厂函数,直接调用它只会得到新的函数对象,而不会触发内部计数的递增或读取。
正确的用法是:先用 const counter = createCounter() 获取闭包实例,然后通过 counter() 调用来累加并打印。
示例中若直接写 createCounter()() 也能立即执行一次,但通常会先保存引用以便多次调用。

