Codewars Solution - Fungsi yang bekerja pada satu sama lain bersarang [ditutup]

11

Saya mencari solusi untuk teka-teki tentang codewars dan saya tidak mengerti mengapa itu berhasil. Bagaimana cara minus () bekerja?

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

TypneveN
sumber
Berikut adalah pertanyaan serupa dengan pendekatan yang sedikit berbeda yang dapat membantu menjelaskan bagaimana ini bekerja
Nick Parsons
1
Saya memilih untuk menutup ini setelah gagal sebagai audit peninjauan: tidak jelas bagi saya apa yang tidak Anda mengerti tentang hal itu. Akan lebih baik jika diedit untuk menjelaskan mengapa Anda pikir minus tidak bekerja.
GS - Minta maaf kepada Monica

Jawaban:

8

Agak rumit. :-)

console.log(eight(minus(three()))); dijalankan dari dalam ke luar, jadi mari kita ikuti:

  • three()- Memanggil makeNum(3, undefined)dan mengembalikan apa yang dikembalikan. makeNum(3, undefined)kembali 3, jadi itulah nilai kembali.
  • minus(3)- Panggilan minus, lewat 3sebagai right. minusmengembalikan fungsi baru yang ditutup right.
  • eight(...)- Panggilan di makeNum(8, fnFromMinus)mana fnFromMinusfungsi yang dikembalikan oleh minus(3). makeNum(8, fnFromMinus)tidak fnFromMinus, lewat 8sebagai left. fnFromMinusmengembalikan hasil left - right(ingat bahwa rightini 3, fnFromMinusditutup di atasnya).

Karena 8 - 3ini 5, hasil akhirnya adalah 5, yang console.logmengembalikan.

Ini versi yang diinstrumentasi:

TJ Crowder
sumber
2

Sebenarnya tidak terlalu rumit jika Anda mengerjakannya langkah demi langkah. Mari kita bekerja dari dalam ke luar. Panggilan:

three()

tanpa parameter berarti Anda memberikan nilai yang tidak ditentukan sebagai func. Jadi sama dengan mengatakan:

makeNum(3, undefined)

Ketika makeNum melihat bahwa func tidak terdefinisi, ia mengembalikan num, yaitu 3.

Jadi kami mengurangi ini menjadi:

eight(minus(3))

Sekarang mari kita lihat caranya

minus(3)

mengevaluasi. minus melihat bahwa parameter yang Anda berikan adalah 3, sehingga mengembalikan fungsi yang dapat menerima parameter "kiri" dan kurangi 3 yang sudah kami sediakan darinya. Itu TIDAK mengeksekusi. Itu hanya duduk di sana, menunggu dipanggil dengan parameter "kiri" sehingga dapat mengurangi 3 darinya.

Jadi kami mengurangi ini menjadi:

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

Sekarang mari kita lihat bagaimana ini mengevaluasi. delapan disebut dengan parameter func sebagai fungsi ini:

function(left){
    return left - 3;
}

Kemudian melewati 8 dan fungsi ini untuk membuatNum ketika ia mengatakan:

makeNum(8, func)

makeNum kemudian melihat bahwa func telah disediakan (dan karenanya tidak terdefinisi) dan mengembalikan func (num) kembali ke delapan fungsi, yang sama dengan meneruskan:

8 - 3

kembali ke fungsi delapan. Delapan fungsi menerima nilai itu dan kemudian mengembalikannya. Jadi kami mengurangi ini menjadi:

5

yang masuk di konsol.

Aaron Plocharczyk
sumber
0

minusmengembalikan fungsi baru untuk setiap doa dengan parameter yang diteruskan untuk itu ditangkap. Ketika fungsi yang dikembalikan dipanggil itu dapat merujuk parameter yang diteruskan saat dipanggil, selain parameter yang diteruskan ke sana. Ini adalah salah satu cara untuk menjelajah fungsi dalam JavaScript.

Menandai
sumber
0

Kode ini adalah contoh dari Fungsi Orde Tinggi dalam bahasa pemrograman fungsional seperti js. Fungsi Javascript diperlakukan sebagai objek dan mereka dapat dilewatkan dan dikembalikan juga.

Fungsi Orde Tinggi adalah fungsi yang menerima fungsi sebagai argumen atau mengembalikan fungsi sebagai output.

minusmengembalikan fungsi anonim ( fungsi tanpa nama yang ditentukan ) pada dasarnya sebagai:

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

Fungsi ini ketika diteruskan ke eightdipanggil sebagai func(8)yang kemudian memberikan hasil sebagai5

bUff23
sumber
0

Cara lain untuk melihatnya - Anda dapat menulis ulang baris ini:

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

Sebagai:

const threeResult = three(); // = 3
const minusResult = minus(threeResult); // = a function that subtracts 3
const eightResult = eights(minusResult); // = 5
Andrea Corbellini
sumber