web-dev-qa-db-fra.com

fermeture de jQuery each () - comment accéder aux variables extérieures

Quel est le meilleur moyen d'accéder à ma variable this.rules à partir de $ .each ()? Toute explication de pourquoi/comment serait également utile!

app.Style = function(node) {
    this.style = node;
    this.rules = [];
    var ruleHolder = node.find('Rule');

    $.each(ruleHolder, function(index, value) {
        var myRule = new app.Rule($(ruleHolder[index]));
        this.rules.Push(myRule);
    });

    console.log(this.rules)
}
18
chris_mac

Stockez une référence à this - nommez-la self, par exemple -, avant d'appeler .each(), puis accédez à rules à l'aide de self.rules:

app.Style = function(node) {
    this.style = node;
    this.rules = [];
    var ruleHolder = node.find('Rule');

    var self = this;
    $.each(ruleHolder, function(index, value) {
        var myRule = new app.Rule($(ruleHolder[index]));
        self.rules.Push(myRule);
    });

    console.log(this.rules)
}
20
João Silva

La réponse ci-dessus de João Silva n’est pas une bonne solution car elle crée une variable globale. En réalité, vous ne transmettez pas une variable "self" à chaque fonction par référence, mais vous vous référez à l'objet global "self".

Dans l'exemple ci-dessus, "this" est l'objet window et la définition de "var self = this" ne fait rien.

L'objet Window a deux propriétés auto-référentielles, window et self. Vous pouvez utiliser l'une ou l'autre variable globale pour faire directement référence à l'objet Window.

En bref, window et self sont des références à l'objet Window, qui est l'objet global de javascript côté client.

Créer une fonction de fermeture est une meilleure solution .

Capture d'écran montrant la fenêtre et l'auto-comparaison

1
Dustin Page

c'est plus élégant sans var self = this;

app.Style = function(node) {
    this.style = node;
    this.rules = [];
    var ruleHolder = node.find('Rule');

    $.each(ruleHolder, function(index, value) {
        var myRule = new app.Rule($(ruleHolder[index]));
        this.rules.Push(myRule);
    }.bind(this));

    console.log(this.rules)
}
0
Zoltán Süle