create_study_note({
workspaceId: "<从 list_missions 获取>",
missionTitle: "<Mission 名称>",
boardTitle: "<Board 名称>",
taskTitle: "<Task 名称>",
subtaskTitle: "<Subtask 名称>",
noteTitle: "<Note 标题>",
blocks: [
{ blockType: "markdown", blockContent: "..." },
{ blockType: "code", blockContent: "..." }
]
})
步骤 1: list_missions() → 获取 workspaceId
步骤 2: create_mission(workspaceId, title) → 获取 missionId(find-or-create)
步骤 3: create_board(missionId, title) → 获取 boardId(find-or-create)
步骤 4: list_tasks(boardId) → 检查是否已有同名 Task
步骤 5: create_task(boardId, title) → 获取 taskId(仅在不存在时)
步骤 6: create_subtask(boardId, taskId, title) → 创建子任务
步骤 7: create_note(missionId, noteTitle, blocks) → 创建笔记(一次性传入所有 blocks)
步骤 8: list_notes(missionId) → 验证笔记已创建
create_study_note({
workspaceId: "<workspaceId>",
missionTitle: "JavaScript 基础",
boardTitle: "错题本",
taskTitle: "闭包相关错题",
subtaskTitle: "整理:闭包与变量捕获",
noteTitle: "闭包与变量捕获 - 错题解析",
blocks: [
{ blockType: "markdown", blockContent: "## 题目:闭包中的循环变量\n\n以下代码输出什么?为什么?\n```js\nfor (var i = 0; i < 3; i++) {\n setTimeout(() => console.log(i), 100);\n}\n```" },
{ blockType: "markdown", blockContent: "## 解答\n\n输出 `3, 3, 3`。\n\n`var` 没有块级作用域,循环结束后 `i` 为 3,三个 setTimeout 回调共享同一个 `i`。\n\n### 修复方式\n1. 使用 `let` 替代 `var`\n2. 使用 IIFE 捕获当前 `i`" },
{ blockType: "markdown", blockContent: "## 常见错误\n\n- 误以为每次迭代会捕获当前 `i` 的值\n- 忽略 `var` 的函数作用域特性" },
{ blockType: "markdown", blockContent: "## 知识点总结\n\n- `var` 是函数作用域,`let` 是块级作用域\n- 闭包捕获的是变量引用而非值的快照\n- `setTimeout` 回调在循环完成后执行" },
{ blockType: "code", blockContent: "// 正确写法:使用 let\nfor (let i = 0; i < 3; i++) {\n setTimeout(() => console.log(i), 100);\n}\n// 输出: 0, 1, 2\n\n// 另一种写法:IIFE\nfor (var i = 0; i < 3; i++) {\n ((j) => {\n setTimeout(() => console.log(j), 100);\n })(i);\n}" },
{ blockType: "markdown", blockContent: "## 练习题\n\n**练习 1**:以下代码的输出是什么?\n```js\nconst funcs = [];\nfor (var i = 0; i < 5; i++) {\n funcs.push(() => i * 2);\n}\nconsole.log(funcs[2]());\n```\n\n**练习 2**:如何修改以下代码使其输出 `[0, 1, 2, 3, 4]`?\n```js\nconst results = [];\nfor (var i = 0; i < 5; i++) {\n setTimeout(() => results.push(i), 0);\n}\n```" }
]
})