Codewars Çözümü - Birbirine etki eden işlevler iç içe [kapalı]


11

Kod savaşlarıyla ilgili bir bulmacanın çözümüne bakıyordum ve neden işe yaradığını anlamıyorum. Minus () nasıl çalışır?

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


İşte bunun nasıl çalıştığına ışık tutmaya yardımcı olabilecek biraz farklı bir yaklaşımla benzer bir soru
Nick Parsons

1
İnceleme denetimi olarak başarısız olduktan sonra bunu kapatmaya oy verdim: bu konuda ne anlamadığınızı bilmiyordum. Eksi neden işe yaramaması gerektiğini düşündüğünüzü açıklamak daha iyi olur.
GS - Monica

Yanıtlar:


8

Biraz karmaşık. :-)

console.log(eight(minus(three()))); içten dışa doğru koşar, bu yüzden onu takip edelim:

  • three()- makeNum(3, undefined)geri döner ve arar . makeNum(3, undefined)İadeler3 , yani dönüş değeri budur.
  • minus(3)- çağrı minus, geçen 3olarak right. minussona eren yeni bir işlev döndürür right.
  • eight(...)- tarafından döndürülen işlevin makeNum(8, fnFromMinus)nerede fnFromMinusolduğunu arar minus(3). makeNum(8, fnFromMinus)yapar fnFromMinusgeçen, 8olarak left. fnFromMinussonucunu döndürür left - right(bunun rightüzerinde 3, fnFromMinuskapalı olduğunu unutmayın ).

Yana 8 - 3olduğunu 5, nihai sonucudur 5, hangi console.logdöner.

İşte enstrümanlı bir versiyon:


2

Eğer adım adım ilerliyorsanız aslında o kadar da karmaşık değil. İçten dışa çalışalım. Arayan:

three()

parametre olmadan, tanımlanmamış bir değeri işlev olarak geçirdiğiniz anlamına gelir. Yani demekle aynı:

makeNum(3, undefined)

MakeNum işlevin tanımsız olduğunu gördüğünde, 3 olan num değerini döndürür.

Bu yüzden bunu aşağıya indirdik:

eight(minus(3))

Şimdi nasıl olduğunu görelim

minus(3)

değerlendirir. eksi, sağladığınız parametrenin 3 olduğunu görür, bu nedenle "sol" bir parametreyi kabul edebilecek ve zaten sağladığımız 3'ü çıkarabilecek bir işlev döndürür. Yürütmez. Sadece orada oturur, "sol" parametre ile çağrılmayı bekler, böylece 3'ü çıkarabilir.

Bu yüzden bunu aşağıya indirdik:

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

Şimdi bunun nasıl değerlendirildiğini görelim. sekiz işlevi func parametresi şu işlevle çağrılır:

function(left){
    return left - 3;
}

Daha sonra 8'i geçer ve bu işlevi şöyle yazdığında makeNum yapar:

makeNum(8, func)

makeNum daha sonra işlevin sağlandığını (ve bu nedenle tanımsız olmadığını) görür ve işlev (num) değerini, iletme ile aynı olan sekiz işleve geri döndürür:

8 - 3

geri sekiz fonksiyona. Sekiz işlev bu değeri alır ve sonra geri döndürür. Bu yüzden bunu aşağıya indirdik:

5

bu konsolda oturum açar.


0

minusher çağırma için, kendisine iletilen parametrelerle birlikte yeni bir işlev döndürür. Döndürülen işlev çağrıldığında, kendisine iletilen parametrelere ek olarak, çağrıldığında geçirilen parametrelere başvurabilir. Bu, JavaScript'teki işlevleri kıvırmanın bir yoludur.


0

Bu kod, js gibi işlevsel programlama dillerinde Yüksek Sıra İşlevlerinin bir örneğidir. Javascript işlevleri nesne olarak kabul edilir ve bunlar da iletilip geri döndürülebilir.

Üst Düzey işlevi, işlevi bağımsız değişken olarak alan veya işlevi çıktı olarak döndüren bir işlevdir.

minusanonim ( tanımlı adı olmayan bir işlev ) işlevini temel olarak şu şekilde döndürüyor :

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

Bu işleve iletildiğinde eightşu şekilde adlandırılır:func(8) sonuç olarak5


0

Bakmanın başka bir yolu - bu satırı yeniden yazabilirsiniz:

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

Gibi:

const threeResult = three(); // = 3
const minusResult = minus(threeResult); // = a function that subtracts 3
const eightResult = eights(minusResult); // = 5
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.