28 votes

Fermeture Javascript résultat inattendu

Le code de fermeture est très court:

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

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

Pourquoi ["foo"] est imprimé au lieu de bar ? Si je commente var fn = ... , le résultat est comme prévu et bar est imprimé. Comment ces deux morceaux de code peuvent-ils être liés?

31voto

DKasipovic Points 3555

Sans le point-virgule après le } du fn , vous appelez en fait le fn avec l'argument (function...) .

Si vous ajoutez le point-virgule manquant, cela fonctionne comme prévu:

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

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

4voto

Bergi Points 104242

Pourquoi ["foo"] est imprimé en lieu et place de l' 'bar'? Comment ces 2 morceaux de code être liés?

Avec les parenthèses autour de l' (function(arg) {…}) , il est considéré comme une expression de fonction de l'argument, juste comme vous l'espériez ('foo') à l'argument de l'IEFE. En fait, foo est maintenant passée à la fonction qui est le résultat de la première invocation:

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

Pour résoudre ce problème, soit toujours mis un point-virgule après vos devoirs, ou l'utilisation d'une déclaration de fonction:

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

3voto

algoni Points 456

ajouter un point-virgule après votre définition de variable comme ceci:

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

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

journaux «bar».

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X