Skip to content

fix: 1-js/06-advanced-functions/06-function-object #1073

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Jul 8, 2022
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 9 additions & 9 deletions 1-js/06-advanced-functions/06-function-object/article.md
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@

# 函数对象,NFE

我们已经知道,在 JavaScript 中,函数就是值
我们已经知道,在 JavaScript 中,函数也是一个值

JavaScript 中的每个值都有一种类型,那么函数是什么类型呢?
JavaScript 中的每个值都有一种类型,那么函数是什么类型呢?

在 JavaScript 中,函数就是对象
在 JavaScript 中,函数的类型是对象

一个容易理解的方式是把函数想象成可被调用的“行为对象(action object)”。我们不仅可以调用它们,还能把它们当作对象来处理:增/删属性,按引用传递等。

Expand Down Expand Up @@ -99,7 +99,7 @@ alert(many.length); // 2

当用户提供了自己的答案后,函数会调用那些 `handlers`。我们可以传入两种 `handlers`:

- 一种是无参函数,它仅在用户回答给出积极的答案时被调用
- 一种是无参函数,它仅在用户给出肯定回答时被调用
- 一种是有参函数,它在两种情况都会被调用,并且返回一个答案。

为了正确地调用 `handler`,我们需要检查 `handler.length` 属性。
Expand All @@ -120,12 +120,12 @@ function ask(question, ...handlers) {

}

// 对于积极的回答,两个 handler 都会被调用
// 对于负面的回答,只有第二个 handler 被调用
// 对于肯定的回答,两个 handler 都会被调用
// 对于否定的回答,只有第二个 handler 被调用
ask("Question?", () => alert('You said yes'), result => alert(result));
```

这种特别的情况就是所谓的 [多态性](https://en.wikipedia.org/wiki/Polymorphism_(computer_science)) —— 根据参数的类型,或者根据在我们的具体情景下的 `length` 来做不同的处理。这种思想在 JavaScript 的库里有应用。
这就是所谓的 [多态性](https://en.wikipedia.org/wiki/Polymorphism_(computer_science)) 的一个例子 —— 根据参数的类型,或者根据在我们的具体情景下的 `length` 来做不同的处理。这种思想在 JavaScript 的库里有应用。

## 自定义属性

Expand Down Expand Up @@ -181,7 +181,7 @@ alert( counter() ); // 1

那么它和闭包谁好谁赖?

两者最大的不同就是如果 `count` 的值位于外层(函数)变量中,那么外部的代码无法访问到它,只有嵌套的函数可以修改它。而如果它是绑定到函数的,那么就很容易
两者最大的不同就是如果 `count` 的值位于外层(函数)变量中,那么外部的代码无法访问到它,只有嵌套的那些函数可以修改它。而如果它是绑定到函数的,那么就可以这样

```js run
function makeCounter() {
Expand Down Expand Up @@ -336,7 +336,7 @@ welcome(); // Hello, Guest(嵌套调用有效)

## 总结

函数就是对象
函数的类型是对象

我们介绍了它们的一些属性:

Expand Down