Skip to content
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

Function object, NFE #205

Open
wants to merge 9 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
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
Original file line number Diff line number Diff line change
@@ -1,18 +1,18 @@
function makeCounter() {
let count = 0;

// ... your code ...
// ... mã của bạn ...
}

let counter = makeCounter();

alert( counter() ); // 0
alert( counter() ); // 1

counter.set(10); // set the new count
counter.set(10); // đặt số lượng đếm mới

alert( counter() ); // 10

counter.decrease(); // decrease the count by 1
counter.decrease(); // giảm số lượng đi 1

alert( counter() ); // 10 (instead of 11)
alert( counter() ); // 10 (thay vì 11)
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@

The solution uses `count` in the local variable, but addition methods are written right into the `counter`. They share the same outer lexical environment and also can access the current `count`.
Giải pháp sử dụng `count` trong biến cục bộ, nhưng các phương thức bổ sung được viết ngay vào `counter`. Chúng chia sẻ cùng một lexical environment bên ngoài và cũng có thể truy cập `count` hiện tại.
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,14 @@ importance: 5

---

# Set and decrease for counter
# Đặt và giảm cho bộ đếm

Modify the code of `makeCounter()` so that the counter can also decrease and set the number:
Sửa đổi mã của `makeCounter()` để bộ đếm cũng có thể giảm và đặt số:

- `counter()` should return the next number (as before).
- `counter.set(value)` should set the counter to `value`.
- `counter.decrease()` should decrease the counter by 1.
- `counter()` nên trả lại số tiếp theo (như trước).
- `counter.set(value)` nên đặt bộ đếm thành `value`.
- `counter.decrease()` nên giảm của bộ đếm 1 đơn vị.

See the sandbox code for the complete usage example.
Xem mã sandbox để biết ví dụ sử dụng đầy đủ.

P.S. You can use either a closure or the function property to keep the current count. Or write both variants.
Tái bút: Bạn có thể sử dụng bao đóng hoặc thuộc tính hàm để giữ số lượng hiện tại. Hoặc viết cả hai biến thể.
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@

1. For the whole thing to work *anyhow*, the result of `sum` must be function.
2. That function must keep in memory the current value between calls.
3. According to the task, the function must become the number when used in `==`. Functions are objects, so the conversion happens as described in the chapter <info:object-toprimitive>, and we can provide our own method that returns the number.
1. Để toàn bộ hoạt động *dù sao đi nữa*, kết quả của `sum` phải là hàm.
2. Hàm đó phải giữ trong bộ nhớ giá trị hiện tại giữa các cuộc gọi.
3. Theo nhiệm vụ, hàm phải trở thành số khi được sử dụng trong `==`. Các hàm là các đối tượng, vì vậy việc chuyển đổi diễn ra như được mô tả trong chương <info:object-toprimitive> và chúng ta có thể cung cấp phương thức trả về số của riêng mình.

Now the code:
Bây giờ là mã:

```js demo run
function sum(a) {
Expand All @@ -28,28 +28,28 @@ alert( sum(6)(-1)(-2)(-3) ); // 0
alert( sum(0)(1)(2)(3)(4)(5) ); // 15
```

Please note that the `sum` function actually works only once. It returns function `f`.
Hãy lưu ý rằng chức năng `sum` thực sự chỉ hoạt động một lần. Nó trả về hàm `f`.

Then, on each subsequent call, `f` adds its parameter to the sum `currentSum`, and returns itself.
Sau đó, trong mỗi lệnh gọi tiếp theo, `f` thêm tham số của nó vào tổng `currentSum` và trả về chính nó.

**There is no recursion in the last line of `f`.**
**Không có đệ quy trong dòng cuối cùng của `f`.**

Here is what recursion looks like:
Đây là những gì đệ quy trông giống:

```js
function f(b) {
currentSum += b;
return f(); // <-- recursive call
return f(); // <-- cuộc gọi đệ quy
}
```

And in our case, we just return the function, without calling it:
Và trong trường hợp của chúng ta, chúng ta chỉ trả về hàm mà không gọi nó:

```js
function f(b) {
currentSum += b;
return f; // <-- does not call itself, returns itself
return f; // <-- không tự gọi, tự trả về
}
```

This `f` will be used in the next call, again return itself, as many times as needed. Then, when used as a number or a string -- the `toString` returns the `currentSum`. We could also use `Symbol.toPrimitive` or `valueOf` here for the conversion.
`f` này sẽ được sử dụng trong lần gọi tiếp theo, một lần nữa sẽ tự trả về chính nó, nhiều lần nếu cần. Sau đó, khi được sử dụng làm số hoặc chuỗi -- `toString` trả về `currentSum`. Chúng ta cũng có thể sử dụng `Symbol.toPrimitive` hoặc `valueOf` tại đây để chuyển đổi.
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@ importance: 2

---

# Sum with an arbitrary amount of brackets
# Tổng với số lượng dấu ngoặc tùy ý

Write function `sum` that would work like this:
Viết hàm `sum` sẽ hoạt động như thế này:

```js
sum(1)(2) == 3; // 1 + 2
Expand All @@ -14,4 +14,5 @@ sum(6)(-1)(-2)(-3) == 0
sum(0)(1)(2)(3)(4)(5) == 15
```

P.S. Hint: you may need to setup custom object to primitive conversion for your function.
Tái bút:
Gợi ý: Bạn có thể cần thiết lập đối tượng tùy chỉnh thành chuyển đổi nguyên thủy cho hàm của mình.
Loading