Giải pháp Codewars - Các chức năng tác động lên nhau [đóng]


11

Tôi đã xem xét một giải pháp cho một câu đố trên từ mã và tôi không hiểu tại sao nó lại hoạt động. Làm thế nào là trừ () làm việc?

function makeNum(num, func) {
    if (func === undefined) {
        return num;
    } else {
        return func(num);
    }
}

function three(func) {
    return makeNum(3, func);
}

function eight(func) {
    return makeNum(8, func);
}

function minus(right) {
    return function(left) {
        return left - right;
    };
}

console.log(eight(minus(three()))); // will log out 5


Đây là một câu hỏi tương tự với cách tiếp cận hơi khác có thể giúp làm sáng tỏ cách thức hoạt động của nó
Nick Parsons

1
Tôi đã bỏ phiếu để đóng cái này sau khi thất bại trong cuộc kiểm toán đánh giá: đối với tôi những gì bạn không hiểu về nó là không rõ ràng. Sẽ tốt hơn nếu được chỉnh sửa để giải thích lý do tại sao bạn nghĩ rằng không nên làm việc.
GS - Xin lỗi đến

Câu trả lời:


8

Nó hơi phức tạp. :-)

console.log(eight(minus(three()))); được chạy từ trong ra ngoài, vì vậy hãy theo dõi qua:

  • three()- gọi makeNum(3, undefined)và trả lại những gì nó trả về. makeNum(3, undefined)trả về 3, vì vậy đó là giá trị trả về.
  • minus(3)- gọi minus, đi vào 3như right. minuslợi nhuận một chức năng mới mà đóng cửa trên right.
  • eight(...)- gọi makeNum(8, fnFromMinus)nơi fnFromMinuslà chức năng được trả về minus(3). makeNum(8, fnFromMinus)không fnFromMinus, đi vào 8như left. fnFromMinustrả về kết quả của left - right(hãy nhớ rằng right3, fnFromMinusđóng trên nó).

Kể từ khi 8 - 35, kết quả cuối cùng là 5, mà console.loglợi nhuận.

Đây là một phiên bản cụ:


2

Nó thực sự không phức tạp nếu bạn làm từng bước một. Hãy làm việc từ trong ra ngoài. Gọi điện thoại:

three()

không có tham số nghĩa là bạn chuyển một giá trị không xác định là func. Vì vậy, nó giống như nói:

makeNum(3, undefined)

Khi makeNum thấy rằng func không được xác định, nó trả về num, là 3.

Vì vậy, chúng tôi đã giảm điều này xuống:

eight(minus(3))

Bây giờ hãy xem làm thế nào

minus(3)

đánh giá. trừ đi thấy rằng tham số bạn cung cấp là 3, do đó, nó trả về một hàm có thể chấp nhận tham số "bên trái" và trừ đi 3 tham số mà chúng tôi đã cung cấp từ nó. Nó KHÔNG thực thi. Nó chỉ ngồi đó, chờ đợi để được gọi với tham số "trái" để có thể trừ 3 từ nó.

Vì vậy, chúng tôi đã giảm điều này xuống:

eight(function(left){
    return left - 3;
})

Bây giờ hãy xem cách đánh giá này. tám được gọi với tham số func là hàm này:

function(left){
    return left - 3;
}

Sau đó, nó vượt qua 8 và hàm này để makeNum khi nó nói:

makeNum(8, func)

makeNum sau đó thấy rằng func đã được cung cấp (và do đó không được xác định) và trả func (num) trở lại hàm tám, giống như việc truyền:

8 - 3

trở lại chức năng tám. Hàm tám nhận giá trị đó và sau đó trả về nó. Vì vậy, chúng tôi đã giảm điều này xuống:

5

được đăng nhập trong giao diện điều khiển.


0

minustrả về một hàm mới cho mỗi lần gọi với các tham số được truyền cho nó. Khi hàm trả về được gọi, nó có thể tham chiếu các tham số được truyền khi được gọi, ngoài bất kỳ tham số nào được truyền cho nó. Đây là một cách để cà ri các chức năng trong JavaScript.


0

Mã này là một ví dụ về Hàm bậc cao trong các ngôn ngữ lập trình chức năng như js. Các hàm Javascript được coi là các đối tượng và chúng cũng có thể được truyền và trả lại.

Hàm bậc cao là hàm nhận hàm dưới dạng đối số hoặc trả về hàm dưới dạng đầu ra.

minusvề cơ bản là trả về một hàm ẩn danh ( một hàm không có tên xác định ) như:

function(left) {
        return left - 3; //right = 3
    };

Hàm này khi được truyền tới eightđược gọi như func(8)sau đó cho kết quả là5


0

Một cách khác để xem xét nó - bạn có thể viết lại dòng này:

console.log(eight(minus(three())));

Như:

const threeResult = three(); // = 3
const minusResult = minus(threeResult); // = a function that subtracts 3
const eightResult = eights(minusResult); // = 5
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.