Quelqu'un peut-il m'expliquer ce qui suit s'il vous plaît.

Cas 1:

function MyObj () {

    this.myArray = new Array();

    for(var i = 0; i<5; i++){
        this.myArray.push(i);
        console.log("add to array:" + i);
    }
}

Qui fonctionne comme je m'y attendais. this.myArray a 0,1,2,3,4.

Cas 2:

function MyObj () {

    this.myArray = new Array();

    $.each([0,1,2,3,4],function(i,v){   
        this.myArray.push(i);
        console.log("add to array:" + v);
    });
}

J'ai reçu des plaintes de Firebug "this.myArray is undefined."

Merci.

0
user200340 18 nov. 2011 à 15:48

5 réponses

Meilleure réponse

Dans votre deuxième exemple, vous passez une fonction à $.each, ce qui signifie que $.each invoquera cette fonction. Par conséquent, à l'intérieur de cette fonction, this fera référence à ce que $.each lui attribue.

Normalement, ce serait une référence à $.each en soi, mais jQuery invoque les rappels à l'aide de .call qui permet de spécifier manuellement le contexte à utiliser. Dans le cas de $.each, this est défini pour toujours faire référence à l'objet actuel de l'itération.

Il existe des moyens de contourner cela, vous pouvez par exemple faire quelque chose comme ceci:

var context = this;
$.each([0,1,2,3,4],function(i,v){   
    context.myArray.push(i);
    console.log("add to array:" + v);
});
4
David Hedlund 18 nov. 2011 à 11:52

En fait, lorsque vous travaillez avec la fonction jQuery .each, cela ne signifie pas myObj obj, mais l'élément de tableau. Vous devez utiliser un tel code.

function MyObj () {

this.myArray = new Array();
var obj = this;

$.each([0,1,2,3,4],function(i,v){   
    obj.myArray.push(i);
    console.log("add to array:" + v);
});
}
0
Gloomcore 18 nov. 2011 à 11:54

this en JavaScript est "lié" à l'objet actuel. Dans le premier exemple, c'est la portée globale, dans le deuxième argument de la fonction (je veux dire 0, 1 et ainsi de suite), où myArray n'est pas défini. Lisez this et cette explication.

Dans votre cas, vous pouvez faire:

function MyObj () {

    this.myArray = new Array();
    var that = this;

    $.each([0,1,2,3,4], function(i,v){   
        this.myArray.push(i);
        console.log("add to array:" + v);
    });
}
0
Xaerxess 18 nov. 2011 à 12:00

Dans la fonction .each, this fait référence à l'élément en cours d'inspection, donc le 0,1,2 ... etc. De plus, le this sera toujours un objet, même si l'original est un nombre (dans votre cas) ou une chaîne ou autre chose.

Voir http://api.jquery.com/jQuery.each/ pour plus d'informations.

Edit: Je pense que pour résoudre votre problème, vous pouvez simplement créer une variable arr qui serait accessible à partir du code .each. C'est-à-dire si .chaque n'est pas de portée mondiale, dont je ne suis pas sûr.

var arr = new Array();

$.each([0,1,2,3,4],function(i,v){   
    arr.push(i);
    console.log("add to array:" + v);
});
0
Willem Mulder 18 nov. 2011 à 11:53

this n'est pas dans la portée correcte pour la fonction MyObj(), qui fait plutôt référence à l'itération actuelle de la boucle $.each(). Faites plutôt:

function MyObj() {

    var $this = this;
    this.myArray = new Array();

    $.each([0,1,2,3,4],function(i,v){   
        $this.myArray.push(i);
        console.log("add to array:" + v);
    });
    console.log(this.myArray);
}
MyObj();

http://jsfiddle.net/KmxJC/

0
Jared Farrish 18 nov. 2011 à 11:53
8181930