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
javascript
TypneveN
sumber
sumber
Jawaban:
Agak rumit. :-)
console.log(eight(minus(three())));
dijalankan dari dalam ke luar, jadi mari kita ikuti:three()
- MemanggilmakeNum(3, undefined)
dan mengembalikan apa yang dikembalikan.makeNum(3, undefined)
kembali3
, jadi itulah nilai kembali.minus(3)
- Panggilanminus
, lewat3
sebagairight
.minus
mengembalikan fungsi baru yang ditutupright
.eight(...)
- Panggilan dimakeNum(8, fnFromMinus)
manafnFromMinus
fungsi yang dikembalikan olehminus(3)
.makeNum(8, fnFromMinus)
tidakfnFromMinus
, lewat8
sebagaileft
.fnFromMinus
mengembalikan hasilleft - right
(ingat bahwaright
ini3
,fnFromMinus
ditutup di atasnya).Karena
8 - 3
ini5
, hasil akhirnya adalah5
, yangconsole.log
mengembalikan.Ini versi yang diinstrumentasi:
Tampilkan cuplikan kode
sumber
Sebenarnya tidak terlalu rumit jika Anda mengerjakannya langkah demi langkah. Mari kita bekerja dari dalam ke luar. Panggilan:
tanpa parameter berarti Anda memberikan nilai yang tidak ditentukan sebagai func. Jadi sama dengan mengatakan:
Ketika makeNum melihat bahwa func tidak terdefinisi, ia mengembalikan num, yaitu 3.
Jadi kami mengurangi ini menjadi:
Sekarang mari kita lihat caranya
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:
Sekarang mari kita lihat bagaimana ini mengevaluasi. delapan disebut dengan parameter func sebagai fungsi ini:
Kemudian melewati 8 dan fungsi ini untuk membuatNum ketika ia mengatakan:
makeNum kemudian melihat bahwa func telah disediakan (dan karenanya tidak terdefinisi) dan mengembalikan func (num) kembali ke delapan fungsi, yang sama dengan meneruskan:
kembali ke fungsi delapan. Delapan fungsi menerima nilai itu dan kemudian mengembalikannya. Jadi kami mengurangi ini menjadi:
yang masuk di konsol.
sumber
minus
mengembalikan 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.sumber
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.
minus
mengembalikan fungsi anonim ( fungsi tanpa nama yang ditentukan ) pada dasarnya sebagai:Fungsi ini ketika diteruskan ke
eight
dipanggil sebagaifunc(8)
yang kemudian memberikan hasil sebagai5
sumber
Cara lain untuk melihatnya - Anda dapat menulis ulang baris ini:
Sebagai:
sumber