Soru Javascript beklenmeyen sonucu kapatma


Kapatma kodu çok kısa:

var fn = function() {
    return function() {
        console.log(arguments);
    }
}

(function(arg) {
    console.log('bar');
})('foo');

Niye ya ["foo"] yerine yazdırıldı bar? Eğer yorum yaparsam var fn = ... , sonuç beklendiği gibi ve bar yazdırılır. Bu 2 kod parçası nasıl olabilir?


28
2018-04-09 10:38


Menşei


bir senin için keman - Liam
Kabul edilen cevabı okuyun: Kendiliğinden işlemeden önce noktalı virgül işlevi? - George
Kodun ne kadar güzel olduğuna bakın! bunu sevdim - doniyor
Büyük ilk soru - Liam
Bu neredeyse bir trolling girişimi gibi görünüyor. Bunu kendin mi yazdın yoksa bir yer buldun mu? - rvighne


Cevaplar:


Sonra noktalı virgül olmadan } arasında fnsen aslında diyorsun fn argüman ile (function...).

Eksik noktalı virgülü eklerseniz, beklediğiniz gibi çalışır:

var fn = function () {
    return function () {
        console.log(arguments);
    }
};

(function (arg) {
    console.log('bar');
})('foo');

31
2018-04-09 10:43



Bir kıymetli örnek olurdu (function() { return function() { console.log(arguments); }})()('foo') Bu da verir foo. - h2ooooooo
Evet, dediğim gibi, noktalı virgül olmadan, biçimlendirmeyle belirgin olmasa da, ikinci kısım aslında ilk olarak birleştirilir. - Damir Kasipovic
Bunu söylediğine katılıyorum - sadece bilgi için ekledim. Bir cevap değildi, bu yüzden doğru cevap eklemek için en uygun yerdi. :-) - h2ooooooo
Evet, elbette, sadece bu durumda biçimlendirmenin, olan şeyin suçu olduğunu belirtmek istedim. Muhtemelen bu iki bölümün biçimlendirmeden dolayı ilgisiz olduğunu düşünmüştü. - Damir Kasipovic
Aslında aramıyor fnama buna iki eylemin sonucunu atamak (undefined). - Bergi


Niye ya ["foo"] yerine yazdırıldı 'bar'? Bu 2 kod parçası nasıl olabilir?

Etrafında parantez ile (function(arg) {…}) beklediğiniz gibi bir işlev ifadesinin argümanı olarak kabul edilir ('foo') IEFE'nin argümanı olmak. Aslında, foo şimdi ilk çağrının sonucu olan işleve iletildi:

var fn = (
        (function() {
            return function() {
                console.log(arguments);
            };
        })
        (function(arg) {
            console.log('bar');
        })
    )
    ('foo');

Bunu düzeltmek için, ödevlerinizi yaptıktan sonra her zaman noktalı virgül koyun veya bir işlev bildirimi kullanın:

function fn() {
    return function() {
        console.log(arguments);
    }
}
(function(arg) {
    console.log('bar');
})('foo');

4
2018-04-09 10:50





Değişken tanımınızdan sonra noktalı virgül ekleme

var fn = function() {
    return function() {
        console.log(arguments);
    }
};

(function(arg) {
    console.log('bar');
})('foo');

günlükleri 'bar'.


3
2018-04-09 10:42



Bu gerçekten "neden" sorusunu cevaplamıyor. - Oleg V. Volkov