diff --git a/1-js/02-first-steps/08-operators/article.md b/1-js/02-first-steps/08-operators/article.md
index d4877f0721..249e64c8aa 100644
--- a/1-js/02-first-steps/08-operators/article.md
+++ b/1-js/02-first-steps/08-operators/article.md
@@ -301,7 +301,7 @@ alert( n ); // 16 (右边部分先被计算,等同于 n *= 8)
## 自增/自减
-
+
对一个数进行加一、减一是最常见的数学运算符之一。
diff --git a/1-js/02-first-steps/11-logical-operators/article.md b/1-js/02-first-steps/11-logical-operators/article.md
index 2f89efeb69..4449958a96 100644
--- a/1-js/02-first-steps/11-logical-operators/article.md
+++ b/1-js/02-first-steps/11-logical-operators/article.md
@@ -279,7 +279,7 @@ alert( !!null ); // false
也就是,第一个非运算将该值转化为布尔类型并取反,第二个非运算再次取反。最后我们就得到了一个任意值到布尔值的转化。
-有更多详细的方法可以完成同样的事 —— 一个内置的 `Boolean` 函数:
+有更多详细的方法可以完成同样的事 —— 一个内建的 `Boolean` 函数:
```js run
alert( Boolean("non-empty string") ); // true
diff --git a/1-js/02-first-steps/15-function-basics/article.md b/1-js/02-first-steps/15-function-basics/article.md
index 071599343c..d6ee104fed 100644
--- a/1-js/02-first-steps/15-function-basics/article.md
+++ b/1-js/02-first-steps/15-function-basics/article.md
@@ -6,7 +6,7 @@
函数是程序的主要“构建模块”。函数使该段代码可以被调用很多次,而不需要写重复的代码。
-我们已经看到了内置函数的示例,如 `alert(message)`、`prompt(message, default)` 和 `confirm(question)`。但我们也可以创建自己的函数。
+我们已经看到了内建函数的示例,如 `alert(message)`、`prompt(message, default)` 和 `confirm(question)`。但我们也可以创建自己的函数。
## 函数声明
diff --git a/1-js/03-code-quality/01-debugging-chrome/article.md b/1-js/03-code-quality/01-debugging-chrome/article.md
index 7558a269d4..e9e7c5bab9 100644
--- a/1-js/03-code-quality/01-debugging-chrome/article.md
+++ b/1-js/03-code-quality/01-debugging-chrome/article.md
@@ -135,7 +135,7 @@ function hello(name) {
一次接一次地点击此按钮,整个脚本的所有语句会被逐个执行。
—— “跨步(Step over)”:运行下一条指令,但 **不会进入到一个函数中**,快捷键 `key:F10`。
-: 跟上一条命令“下一步(Step)”类似,但如果下一条语句是函数调用则表现不同。这里的函数指的是:不是内置的如 `alert` 函数等,而是我们自己写的函数。
+: 跟上一条命令“下一步(Step)”类似,但如果下一条语句是函数调用则表现不同。这里的函数指的是:不是内建的如 `alert` 函数等,而是我们自己写的函数。
“下一步(Step)”命令进入函数内部并在第一行暂停执行,而“跨步(Step over)”在无形中执行函数调用,跳过了函数的内部。
diff --git a/1-js/03-code-quality/02-coding-style/article.md b/1-js/03-code-quality/02-coding-style/article.md
index d02ff01cf4..37e6f1abd5 100644
--- a/1-js/03-code-quality/02-coding-style/article.md
+++ b/1-js/03-code-quality/02-coding-style/article.md
@@ -337,7 +337,7 @@ function pow(x, n) {
你也可以从网上下载风格规则集并进行扩展。有关安装的更多详细信息,请参见 。
-此外,某些 IDE 有内置的检查器,这非常方便,但是不像 ESLint 那样可自定义。
+此外,某些 IDE 有内建的检查器,这非常方便,但是不像 ESLint 那样可自定义。
## 总结
diff --git a/1-js/03-code-quality/05-testing-mocha/article.md b/1-js/03-code-quality/05-testing-mocha/article.md
index 28275583d3..2811361a3f 100644
--- a/1-js/03-code-quality/05-testing-mocha/article.md
+++ b/1-js/03-code-quality/05-testing-mocha/article.md
@@ -87,7 +87,7 @@ describe("pow", function() {
- [Mocha](http://mochajs.org/) —— 核心框架:提供了包括通用型测试函数 `describe` 和 `it`,以及用于运行测试的主函数。
- [Chai](http://chaijs.com) —— 提供很多断言(assertion)支持的库。它提供了很多不同的断言,现在我们只需要用 `assert.equal`。
-- [Sinon](http://sinonjs.org/) —— 用于监视函数、模拟内置函数和其他函数的库,我们在后面才会用到它。
+- [Sinon](http://sinonjs.org/) —— 用于监视函数、模拟内建函数和其他函数的库,我们在后面才会用到它。
这些库都既适用于浏览器端,也适用于服务器端。这里我们将使用浏览器端的变体。
diff --git a/1-js/04-object-basics/01-object/article.md b/1-js/04-object-basics/01-object/article.md
index fb9c37dd65..1148ad0b04 100644
--- a/1-js/04-object-basics/01-object/article.md
+++ b/1-js/04-object-basics/01-object/article.md
@@ -451,7 +451,7 @@ for(let code in codes) {
所以,"49" 是一个整数属性名,因为我们把它转换成整数,再转换回来,它还是一样的。但是 "+49" 和 "1.2" 就不行了:
```js run
-// Math.trunc 是内置的去除小数部分的方法。
+// Math.trunc 是内建的去除小数部分的方法。
alert( String(Math.trunc(Number("49"))) ); // "49",相同,整数属性
alert( String(Math.trunc(Number("+49"))) ); // "49",不同于 "+49" ⇒ 不是整数属性
alert( String(Math.trunc(Number("1.2"))) ); // "1",不同于 "1.2" ⇒ 不是整数属性
diff --git a/1-js/04-object-basics/06-constructor-new/article.md b/1-js/04-object-basics/06-constructor-new/article.md
index 4f814de0e0..c84707cb39 100644
--- a/1-js/04-object-basics/06-constructor-new/article.md
+++ b/1-js/04-object-basics/06-constructor-new/article.md
@@ -221,7 +221,7 @@ john = {
我们可以使用构造函数来创建多个类似的对象。
-JavaScript 为许多内置的对象提供了构造函数:比如日期 `Date`、集合 `Set` 以及其他我们计划学习的内容。
+JavaScript 为许多内建的对象提供了构造函数:比如日期 `Date`、集合 `Set` 以及其他我们计划学习的内容。
```smart header="对象,我们还会回来哒!"
在本章中,我们只介绍了关于对象和构造器的基础知识。它们对于我们在下一章中,学习更多关于数据类型和函数的相关知识非常重要。
diff --git a/1-js/04-object-basics/08-symbol/article.md b/1-js/04-object-basics/08-symbol/article.md
index aacc83f2a6..bdef21cf56 100644
--- a/1-js/04-object-basics/08-symbol/article.md
+++ b/1-js/04-object-basics/08-symbol/article.md
@@ -272,6 +272,6 @@ Symbol 有两个主要的使用场景:
因此我们可以使用 Symbol 属性“秘密地”将一些东西隐藏到我们需要的对象中,但其他地方看不到它。
-2. JavaScript 使用了许多系统 Symbol,这些 Symbol 可以作为 `Symbol.*` 访问。我们可以使用它们来改变一些内置行为。例如,在本教程的后面部分,我们将使用 `Symbol.iterator` 来进行 [迭代](info:iterable) 操作,使用 `Symbol.toPrimitive` 来设置 [对象原始值的转换](info:object-toprimitive) 等等。
+2. JavaScript 使用了许多系统 Symbol,这些 Symbol 可以作为 `Symbol.*` 访问。我们可以使用它们来改变一些内建行为。例如,在本教程的后面部分,我们将使用 `Symbol.iterator` 来进行 [迭代](info:iterable) 操作,使用 `Symbol.toPrimitive` 来设置 [对象原始值的转换](info:object-toprimitive) 等等。
-从技术上说,Symbol 不是 100% 隐藏的。有一个内置方法 [Object.getOwnPropertySymbols(obj)](mdn:js/Object/getOwnPropertySymbols) 允许我们获取所有的 Symbol。还有一个名为 [Reflect.ownKeys(obj)](mdn:js/Reflect/ownKeys) 的方法可以返回一个对象的 **所有** 键,包括 Symbol。所以它们并不是真正的隐藏。但是大多数库、内置方法和语法结构都没有使用这些方法。
+从技术上说,Symbol 不是 100% 隐藏的。有一个内建方法 [Object.getOwnPropertySymbols(obj)](mdn:js/Object/getOwnPropertySymbols) 允许我们获取所有的 Symbol。还有一个名为 [Reflect.ownKeys(obj)](mdn:js/Reflect/ownKeys) 的方法可以返回一个对象的 **所有** 键,包括 Symbol。所以它们并不是真正的隐藏。但是大多数库、内建方法和语法结构都没有使用这些方法。
diff --git a/1-js/05-data-types/06-iterable/article.md b/1-js/05-data-types/06-iterable/article.md
index fc769a7bc0..749abbf500 100644
--- a/1-js/05-data-types/06-iterable/article.md
+++ b/1-js/05-data-types/06-iterable/article.md
@@ -26,7 +26,7 @@ let range = {
// for(let num of range) ... num=1,2,3,4,5
```
-为了让 `range` 对象可迭代(也就让 `for..of` 可以运行)我们需要为对象添加一个名为 `Symbol.iterator` 的方法(一个专门用于使对象可迭代的内置 symbol)。
+为了让 `range` 对象可迭代(也就让 `for..of` 可以运行)我们需要为对象添加一个名为 `Symbol.iterator` 的方法(一个专门用于使对象可迭代的内建 symbol)。
1. 当 `for..of` 循环启动时,它会调用这个方法(如果没找到,就会报错)。这个方法必须返回一个 **迭代器(iterator)** —— 一个有 `next` 方法的对象。
2. 从此开始,`for..of` **仅适用于这个被返回的对象**。
@@ -296,7 +296,7 @@ alert( str.slice(1, 3) ); // 乱码(两个不同 UTF-16 扩展字符碎片拼
- `obj[Symbol.iterator]()` 的结果被称为 **迭代器(iterator)**。由它处理进一步的迭代过程。
- 一个迭代器必须有 `next()` 方法,它返回一个 `{done: Boolean, value: any}` 对象,这里 `done:true` 表明迭代结束,否则 `value` 就是下一个值。
- `Symbol.iterator` 方法会被 `for..of` 自动调用,但我们也可以直接调用它。
-- 内置的可迭代对象例如字符串和数组,都实现了 `Symbol.iterator`。
+- 内建的可迭代对象例如字符串和数组,都实现了 `Symbol.iterator`。
- 字符串迭代器能够识别代理对(surrogate pair)。(译注:代理对也就是 UTF-16 扩展字符。)
diff --git a/1-js/05-data-types/07-map-set/article.md b/1-js/05-data-types/07-map-set/article.md
index c24a748bf0..b06fb4b53a 100644
--- a/1-js/05-data-types/07-map-set/article.md
+++ b/1-js/05-data-types/07-map-set/article.md
@@ -136,7 +136,7 @@ for (let entry of recipeMap) { // 与 recipeMap.entries() 相同
迭代的顺序与插入值的顺序相同。与普通的 `Object` 不同,`Map` 保留了此顺序。
```
-除此之外,`Map` 有内置的 `forEach` 方法,与 `Array` 类似:
+除此之外,`Map` 有内建的 `forEach` 方法,与 `Array` 类似:
```js
// 对每个键值对 (key, value) 运行 forEach 函数
diff --git a/1-js/05-data-types/12-json/article.md b/1-js/05-data-types/12-json/article.md
index 5e7c240fc4..fb9231458e 100644
--- a/1-js/05-data-types/12-json/article.md
+++ b/1-js/05-data-types/12-json/article.md
@@ -359,7 +359,7 @@ alert( JSON.stringify(meetup) );
*/
```
-在这儿我们可以看到 `date` `(1)` 变成了一个字符串。这是因为所有日期都有一个内置的 `toJSON` 方法来返回这种类型的字符串。
+在这儿我们可以看到 `date` `(1)` 变成了一个字符串。这是因为所有日期都有一个内建的 `toJSON` 方法来返回这种类型的字符串。
现在让我们为对象 `room` 添加一个自定义的 `toJSON`:
diff --git a/1-js/06-advanced-functions/05-global-object/article.md b/1-js/06-advanced-functions/05-global-object/article.md
index 25b7101cc0..d530381a86 100644
--- a/1-js/06-advanced-functions/05-global-object/article.md
+++ b/1-js/06-advanced-functions/05-global-object/article.md
@@ -1,7 +1,7 @@
# 全局对象
-全局对象提供可在任何地方使用的变量和函数。默认情况下,这些全局变量内置于语言或环境中。
+全局对象提供可在任何地方使用的变量和函数。默认情况下,这些全局变量内建于语言或环境中。
在浏览器中,它的名字是 "window",对 Node.js 而言,它的名字是 "global",其它环境可能用的是别的名字。
diff --git a/1-js/06-advanced-functions/06-function-object/article.md b/1-js/06-advanced-functions/06-function-object/article.md
index f8bf4b6df2..9f2fe35f58 100644
--- a/1-js/06-advanced-functions/06-function-object/article.md
+++ b/1-js/06-advanced-functions/06-function-object/article.md
@@ -79,7 +79,7 @@ alert( arr[0].name ); // <空字符串>
## 属性 "length"
-还有另一个内置属性 "length",它返回函数入参的个数,比如:
+还有另一个内建属性 "length",它返回函数入参的个数,比如:
```js run
function f1(a) {}
diff --git a/1-js/06-advanced-functions/09-call-apply-decorators/article.md b/1-js/06-advanced-functions/09-call-apply-decorators/article.md
index 1f484e8503..585f219592 100644
--- a/1-js/06-advanced-functions/09-call-apply-decorators/article.md
+++ b/1-js/06-advanced-functions/09-call-apply-decorators/article.md
@@ -120,7 +120,7 @@ func(2);
让我们来解决这个问题。
-有一个特殊的内置函数方法 [func.call(context, ...args)](mdn:js/Function/call),它允许调用一个显式设置 `this` 的函数。
+有一个特殊的内建函数方法 [func.call(context, ...args)](mdn:js/Function/call),它允许调用一个显式设置 `this` 的函数。
语法如下:
diff --git a/1-js/07-object-properties/01-property-descriptors/article.md b/1-js/07-object-properties/01-property-descriptors/article.md
index 23903b8206..ca6875fc1b 100644
--- a/1-js/07-object-properties/01-property-descriptors/article.md
+++ b/1-js/07-object-properties/01-property-descriptors/article.md
@@ -148,7 +148,7 @@ user.name = "Pete"; // Error
现在让我们向 `user` 添加一个自定义的 `toString`。
-通常,对象的内置 `toString` 是不可枚举的,它不会显示在 `for..in` 中。但是如果我们添加我们自己的 `toString`,那么默认情况下它将显示在 `for..in` 中,如下所示:
+通常,对象中内建的 `toString` 是不可枚举的,它不会显示在 `for..in` 中。但是如果我们添加我们自己的 `toString`,那么默认情况下它将显示在 `for..in` 中,如下所示:
```js run
let user = {
diff --git a/1-js/08-prototypes/03-native-prototypes/article.md b/1-js/08-prototypes/03-native-prototypes/article.md
index 56e933dffb..5590f7f704 100644
--- a/1-js/08-prototypes/03-native-prototypes/article.md
+++ b/1-js/08-prototypes/03-native-prototypes/article.md
@@ -1,6 +1,6 @@
# 原生的原型
-`"prototype"` 属性在 JavaScript 自身的核心部分中被广泛地应用。所有的内置构造函数都用到了它。
+`"prototype"` 属性在 JavaScript 自身的核心部分中被广泛地应用。所有的内建构造函数都用到了它。
首先,我们将看看原生原型的详细信息,然后学习如何使用它为内建对象添加新功能。
@@ -84,7 +84,7 @@ alert(arr); // 1,2,3 <-- Array.prototype.toString 的结果

-浏览器内的工具,像 Chrome 开发者控制台也会显示继承性(可能需要对内置对象使用 `console.dir`):
+浏览器内的工具,像 Chrome 开发者控制台也会显示继承性(可能需要对内建对象使用 `console.dir`):

diff --git a/2-ui/1-document/02-dom-nodes/article.md b/2-ui/1-document/02-dom-nodes/article.md
index 82f29a06c2..2ac191210a 100644
--- a/2-ui/1-document/02-dom-nodes/article.md
+++ b/2-ui/1-document/02-dom-nodes/article.md
@@ -233,7 +233,7 @@ drawHtmlTree(node6, 'div.domtree', 690, 500);

在工具的右侧部分有以下子选项卡:
-- **Styles** — 我们可以看到按规则应用于当前元素的 CSS 规则,包括内置规则(灰色)。几乎所有内容都可以就地编辑,包括下面的方框的 dimension/margin/padding。
+- **Styles** — 我们可以看到按规则应用于当前元素的 CSS 规则,包括内建规则(灰色)。几乎所有内容都可以就地编辑,包括下面的方框的 dimension/margin/padding。
- **Computed** — 按属性查看应用于元素的 CSS:对于每个属性,我们可以都可以看到赋予它的规则(包括 CSS 继承等)。
- **Event Listeners** — 查看附加到 DOM 元素的事件侦听器(我们将在本教程的下一部分介绍它们)。
- ……等。
diff --git a/2-ui/1-document/08-styles-and-classes/article.md b/2-ui/1-document/08-styles-and-classes/article.md
index f96f57509f..925b9469fd 100644
--- a/2-ui/1-document/08-styles-and-classes/article.md
+++ b/2-ui/1-document/08-styles-and-classes/article.md
@@ -126,7 +126,7 @@ document.body.style.display = "none"; // 隐藏
setTimeout(() => document.body.style.display = "", 1000); // 恢复正常
```
-如果我们将 `display` 设置为空字符串,那么浏览器通常会应用 CSS 类以及内置样式,就好像根本没有这样的 `style` 属性一样。
+如果我们将 `display` 设置为空字符串,那么浏览器通常会应用 CSS 类以及内建样式,就好像根本没有这样的 `style` 属性一样。
````smart header="用 `style.cssText` 进行完全的重写"
通常,我们使用 `style.*` 来对各个样式属性进行赋值。我们不能像这样的 `div.style="color: red; width: 100px"` 设置完整的属性,因为 `div.style` 是一个对象,并且它是只读的。
diff --git a/6-data-storage/03-indexeddb/article.md b/6-data-storage/03-indexeddb/article.md
index 4d2c6ef23d..86cf1cf65f 100644
--- a/6-data-storage/03-indexeddb/article.md
+++ b/6-data-storage/03-indexeddb/article.md
@@ -5,7 +5,7 @@ libs:
# IndexedDB
-IndexedDB 是一个浏览器内置的数据库,它比 `localStorage` 强大得多。
+IndexedDB 是一个浏览器内建的数据库,它比 `localStorage` 强大得多。
- 通过支持多种类型的键,来存储几乎可以是任何类型的值。
- 支撑事务的可靠性。
diff --git a/7-animation/2-css-animations/article.md b/7-animation/2-css-animations/article.md
index df6b1f26be..b4db756320 100644
--- a/7-animation/2-css-animations/article.md
+++ b/7-animation/2-css-animations/article.md
@@ -195,7 +195,7 @@ CSS:
}
```
-CSS 提供几条内置的曲线:`linear`、`ease`、`ease-in`、`ease-out` 和 `ease-in-out`。
+CSS 提供几条内建的曲线:`linear`、`ease`、`ease-in`、`ease-out` 和 `ease-in-out`。
`linear` 其实就是 `cubic-bezier(0, 0, 1, 1)` 的简写 —— 一条直线,刚刚我们已经看过了。
diff --git a/7-animation/3-js-animation/article.md b/7-animation/3-js-animation/article.md
index fcf83f4927..2fc0e5618b 100644
--- a/7-animation/3-js-animation/article.md
+++ b/7-animation/3-js-animation/article.md
@@ -417,7 +417,7 @@ bounceEaseInOut = makeEaseInOut(bounce);
## 总结
-JavaScript 动画应该通过 `requestAnimationFrame` 实现。该内置方法允许设置回调函数,以便在浏览器准备重绘时运行。那通常很快,但确切的时间取决于浏览器。
+JavaScript 动画应该通过 `requestAnimationFrame` 实现。该内建方法允许设置回调函数,以便在浏览器准备重绘时运行。那通常很快,但确切的时间取决于浏览器。
当页面在后台时,根本没有重绘,因此回调将不会运行:动画将被暂停并且不会消耗资源。那很棒。
diff --git a/8-web-components/2-custom-elements/article.md b/8-web-components/2-custom-elements/article.md
index 69e1681290..751dde8e0c 100644
--- a/8-web-components/2-custom-elements/article.md
+++ b/8-web-components/2-custom-elements/article.md
@@ -3,16 +3,16 @@
我们可以通过描述带有自己的方法、属性和事件等的类来创建自定义 HTML 元素。
-在 custom elements (自定义标签)定义完成之后,我们可以将其和 HTML 的内置标签一同使用。
+在 custom elements (自定义标签)定义完成之后,我们可以将其和 HTML 的内建标签一同使用。
-这是一件好事,因为虽然 HTML 有非常多的标签,但仍然是有穷尽的。如果我们需要像 ``、``、``…… 这样的标签,内置标签并不能满足我们。
+这是一件好事,因为虽然 HTML 有非常多的标签,但仍然是有穷尽的。如果我们需要像 ``、``、``…… 这样的标签,内建标签并不能满足我们。
我们可以把上述的标签定义为特殊的类,然后使用它们,就好像它们本来就是 HTML 的一部分一样。
Custom elements 有两种:
1. **Autonomous custom elements (自主自定义标签)** —— "全新的" 元素, 继承自 `HTMLElement` 抽象类.
-2. **Customized built-in elements (自定义内置元素)** —— 继承内置的 HTML 元素,比如自定义 `HTMLButtonElement` 等。
+2. **Customized built-in elements (自定义内建元素)** —— 继承内建的 HTML 元素,比如自定义 `HTMLButtonElement` 等。
我们将会先创建 autonomous 元素,然后再创建 customized built-in 元素。
@@ -68,7 +68,7 @@ customElements.define("my-element", MyElement);
```smart header="Custom element 名称必须包括一个短横线 `-`"
Custom element 名称必须包括一个短横线 `-`, 比如 `my-element` 和 `super-button` 都是有效的元素名,但 `myelement` 并不是。
-这是为了确保 custom element 和内置 HTML 元素之间不会发生命名冲突。
+这是为了确保 custom element 和内建 HTML 元素之间不会发生命名冲突。
```
## 例子: "time-formatted"
@@ -115,7 +115,7 @@ customElements.define("time-formatted", TimeFormatted); // (2)
>
```
-1. 这个类只有一个方法 `connectedCallback()` —— 在 `` 元素被添加到页面的时候,浏览器会调用这个方法(或者当 HTML 解析器检测到它的时候),它使用了内置的时间格式化工具 [Intl.DateTimeFormat](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat),这个工具可以非常好地展示格式化之后的时间,在各浏览器中兼容性都非常好。
+1. 这个类只有一个方法 `connectedCallback()` —— 在 `` 元素被添加到页面的时候,浏览器会调用这个方法(或者当 HTML 解析器检测到它的时候),它使用了内建的时间格式化工具 [Intl.DateTimeFormat](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat),这个工具可以非常好地展示格式化之后的时间,在各浏览器中兼容性都非常好。
2. 我们需要通过 `customElements.define(tag, class)` 来注册这个新元素。
3. 接下来在任何地方我们都可以使用这个新元素了。
@@ -302,7 +302,7 @@ customElements.define('user-info', class extends HTMLElement {
我们可以很明显地看到外层元素并没有等待内层元素。
-并没有任何内置的回调方法可以在嵌套元素渲染好之后通知我们。但我们可以自己实现这样的回调。比如,内层元素可以分派像 `initialized` 这样的事件,同时外层的元素监听这样的事件并做出响应。
+并没有任何内建的回调方法可以在嵌套元素渲染好之后通知我们。但我们可以自己实现这样的回调。比如,内层元素可以分派像 `initialized` 这样的事件,同时外层的元素监听这样的事件并做出响应。
## Customized built-in elements
@@ -310,7 +310,7 @@ customElements.define('user-info', class extends HTMLElement {
但上述两点同样是非常重要的。比如,搜索引擎会对这些事情感兴趣,比如我们真的展示了时间。或者如果我们创建了一个特别的按钮,为什么不复用已有的 `