$ .each()jquery中的未定义变量

时间:2014-04-16 20:09:06

标签: javascript jquery

我在javascript中使用这个类:

function rMotoristaList() {
}

rMotoristaList.prototype.permInsert = false;
rMotoristaList.prototype.permSelect = false;
rMotoristaList.prototype.permUpdate = false;
rMotoristaList.prototype.permDelete = false;

rMotoristaList.prototype.init = function() {
    // Pega as permissoes
    var perm = new cPermissao();
    this.permInsert = perm.verificaPermissao(ID_CAD_MOTORISTAS, "insert");
    this.permUpdate = perm.verificaPermissao(ID_CAD_MOTORISTAS, "update");
    this.permDelete = perm.verificaPermissao(ID_CAD_MOTORISTAS, "delete");

    if (this.permInsert == false) {
        $("#btn-add-novo").hide();
    }
};

rMotoristaList.prototype.renderGrid = function(data) {
    var html = "";

    // Faz o loop em todos os elementos retornados
    $.each(data,function(index, motorista) {
        if (this.permUpdate != false) {
            //Do something
        }
    }
};

attrbitue permUpdatefalse,但是,当我在$ .each()内部比较他时,不起作用,我会收到undefined

如何在this.permUpdate内获得$.each()的价值?

3 个答案:

答案 0 :(得分:2)

在匿名函数this中,不会引用rMotoristaList。您可以缓存this并使用它。

rMotoristaList.prototype.renderGrid = function(data) {
    var html = "",
        self = this;

    // Faz o loop em todos os elementos retornados
    $.each(data,function(index, motorista) {
        if (self.permUpdate != false) {
            //Do something
        }
};

答案 1 :(得分:1)

this内的$.each()是指.each()的函数上下文,而不是代码中的函数上下文。您可以做的是将您的上下文保存在.each()块之外,在JavaScript中称为闭包,请参阅https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Closures

rMotoristaList.prototype.renderGrid = function(data) {
    var html = "";
    var that = this;
    // Faz o loop em todos os elementos retornados
    $.each(data,function(index, motorista) {
        if (that.permUpdate != false) {
        //Do something
        }
    }

};

答案 2 :(得分:1)

还有另一种方法,在这种情况下可能会有所改善......

rMotoristaList.prototype.renderGrid = function(data) {
    var html = "";

    // Faz o loop em todos os elementos retornados
    $.each(data,function(index, motorista) {
        if (this.permUpdate != false) {
            //Do something
        }
    }.bind(this)); // <-- Bind the function to the right context.
};

这样你就可以有效地说,这个函数应该用rMotoristaList实例的上下文来执行。