2 votes

JavaScript: Accéder entre deux fonctions définies dans la portée globale

Est-ce que quelqu'un peut m'expliquer ce qui suit. J'ai deux fonctions JavaScript définies dans la portée globale comme suit :

    var foo = function () {
        var that = this;

        that.toString = function () { return "foobar" };

        return that;
    }();

    alert(foo.toString());

    var foo2 = function (foo) {
        var that;

        that = $.extend(true, {}, foo);

        return that;
    }();

Alarmer foo.toString() fonctionne comme je m'y attendais car foo est assigné au résultat de l'invocation de la fonction. Cependant, j'aurais attendu que foo2 ait accès à foo. Pourtant à l'intérieur de foo2, foo est indéfini. Est-ce que quelqu'un peut aider ?

Merci beaucoup, Mike.

2voto

Andy E Points 132925

Vous avez créé une fonction qui accepte un argument appelé foo. Cette variable locale remplacera la variable globale du même nom. Si vous ne passez rien pour cet argument, le foo local est automatiquement défini sur undefined. Vous pouvez soit supprimer l'argument soit passer le foo global.

var foo2 = function (foo) {
    var that;

    that = $.extend(true, {}, foo); // foo provient de la portée locale

    return that;
}(foo); // Pass in foo

Ou

var foo2 = function () { // supprimer l'argument
    var that;

    that = $.extend(true, {}, foo); // foo provient de la portée globale

    return that;
}();

1voto

RichieHindle Points 98544

foo est indéfini dans foo2 car vous êtes en train de définir un foo local en tant que paramètre :

var foo2 = function (foo) { ...

et vous appelez ensuite foo2 sans arguments :

}();

0voto

tcooc Points 5006

Vous faites en sorte que foo2 crée une autre variable appelée foo à l'intérieur de sa portée, avec une valeur de undefined. Si vous voulez accéder à foo, utilisez:

var foo2 = function (foo) {
  //code
}(foo);

ou y accédez depuis l'objet window:

window.foo

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