HarmonyOS鸿蒙Next ArkTs语法介绍→语法进阶关于闭包函数代码的错误

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

(我是初学者,别喷我\(^ω^\))

图

图

图


更多关于HarmonyOS鸿蒙Next ArkTs语法介绍→语法进阶关于闭包函数代码的错误的实战教程也可以访问 https://www.itying.com/category-93-b0.html

5 回复

你的判断是对的。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()

混用了。

前者:

创建闭包

后者:

执行闭包

这是两回事。

可以在课程评论里回复下,或者工单提一下。

cke_1176.png

在 ArkTS 中,闭包函数常见错误:1)捕获变量时未使用 @State@Prop 修饰,导致状态不更新;2)闭包中引用 this 未用箭头函数,导致作用域丢失;3)闭包内修改外部 let 变量时未考虑生命周期,在异步任务中产生意外值。检查变量声明和回调写法即可。

你的观察是正确的。
createCounter() 是一个返回闭包函数的工厂函数,直接调用它只会得到新的函数对象,而不会触发内部计数的递增或读取。
正确的用法是:先用 const counter = createCounter() 获取闭包实例,然后通过 counter() 调用来累加并打印。
示例中若直接写 createCounter()() 也能立即执行一次,但通常会先保存引用以便多次调用。

回到顶部