范围"这个"在jQuery函数中

时间:2015-07-01 12:05:29

标签: javascript jquery arrays

今天我遇到了一个非常有趣的问题,很多人可能会发现这些问题很简单,但由于我刚学会使用jQuery,我很想知道它是如何工作的。

我有两个数组,我在迭代数组元素。一个数组是arrAllDetailsConstantData,另一个数组是arrAllDetails。我想使用 arrAllDetails 比较 arrAllDetailsConstantData 更新

我正在使用嵌套循环。但正在发生的是,在更新数组 arrAllDetails 时,数组 arrAllDetailsConstantData 也会更新。我认为这与父母的范围有某种关系(尽管我只是猜测)。你能帮帮我吗?

这是我的代码:

$.each(privateVariables.arrAllDetailsConstantData, function() {
    if (this.AssociationId == value && this.uniqueChargeAttr == uniqueChargeAttr) {

        if (this.Units == $("#txtUnits").val() &&
            this.Modifier1 == $("#txtModifier1").val() &&
            this.Modifier2 == $("#txtModifier2").val() &&
            this.Modifier3 == $("#txtModifier3").val() &&
            this.Modifier4 == $("#txtModifier4").val() &&
            this.DxOption == $("#ddlDxOption").val() &&
            this.DxCode1 == $("#txtDx1").val() &&
            this.DxCode2 == $("#txtDx2").val() &&
            this.DxCode3 == $("#txtDx3").val() &&
            this.DxCode4 == $("#txtDx4").val()) {

        } else {
            $.each(arrAllDetails, function() {
                if (this.AssociationId == value && this.uniqueChargeAttr == uniqueChargeAttr) {
                    this.ActionType = "M";
                    this.CptName = $("#lblCptDesc").text();
                    this.CptDesc = $("#lblCptDesc").text();
                    this.Units = $("#txtUnits").val();
                    this.Modifier1 = $("#txtModifier1").val();
                    this.Modifier2 = $("#txtModifier2").val();
                    this.Modifier3 = $("#txtModifier3").val();
                    this.Modifier4 = $("#txtModifier4").val();
                    this.DxOption = $("#ddlDxOption").val();
                    this.DxCode1 = $("#txtDx1").val();
                    this.DxCode2 = $("#txtDx2").val();
                    this.DxCode3 = $("#txtDx3").val();
                    this.DxCode4 = $("#txtDx4").val();

                    privateVariables.arrActionData.push(this);

                }
            });
        }
    }
});

// test code ends

3 个答案:

答案 0 :(得分:1)

  • 首先,jQuery' this引用调用元素。

$.each中,这是指迭代元素

因此,在您的第一个循环中:$.each(privateVariables.arrAllDetailsConstantData, function() {});this将是arrAllDetailsConstantData数组的当前循环元素

在第二个循环中,this将是arrAllDetails数组的当前循环元素

  • 其次,我们需要数组创建代码。

请勿忘记,在许多语言中,如果使用此arrAllDetailsConstantData = arrAllDetails,则指向这两个对象的指针指向相同的内存范围

在这种情况下,请使用arrAllDetailsConstantData = arrAllDetails.slice();中的Array.prototype.slice

答案 1 :(得分:0)

对于"这个"的范围你可以查看JQuery and 'this' object

至于你的代码:你需要首先添加你创建两个数组的方式。

根据您的代码,它们似乎是通过使用相同的元素创建的(因此arrDetails似乎是arrAllDetails中对象的子集)。

的方式
$.each(arrDetails, function() {arrAllDetails.push(this); });

或简单地说:

arrDetails = arrAllDetails;

如果是这种情况,则数组中的对象实际上是SAME。因此,编辑一个数组中的元素也会在另一个数组中编辑它(它们指向内存中的同一个对象)。

我不确定你要完成什么,但是如果你想让对象不同,你需要克隆这些条目,使它们成为单独的对象,而不仅仅是使用它们。

除此之外,您对此的基本理解(适用于最近的范围)是正确的,但被其他问题所覆盖。

答案 2 :(得分:0)

在Javascript this中指的是函数执行的所有者。知道所有者实际上是什么并不总是容易的。通过HTML-Elements的范围,this通常引用元素本身。迭代内部(如$.each(data, function)this指的是迭代的项目。

您在2个不同的上下文中使用this。每次都在另一次迭代中。

$.each(privateVariables.arrAllDetailsConstantData, function() {
    if (this.AssociationId == value && this.uniqueChargeAttr == uniqueChargeAttr) {
        //in this context: "this" refers to the currently selected 
        //item of the iteration over: 
        //  privateVariables.arrAllDetailsConstantData
    } else {
        $.each(arrAllDetails, function() {
            // in this context: "this" refers to the selected item
            // of the iteration over "arrAllDetails"
        });
    }
});

通过将this绑定到局部变量,可以在输入迭代时保留上下文。

$.each(privateVariables.arrAllDetailsConstantData, function() {
    if (this.AssociationId == value && this.uniqueChargeAttr == uniqueChargeAttr) {
        // this refers to an item from privateVariables.arrAllDetailsConstantData
    } else {
        var context = this;
        $.each(arrAllDetails, function() {
            // context refers to an item from privateVariables.arrAllDetailsConstantData
            // so: use 
            context.AssociationId
            // instead of 
            this.AssociationId
        });
    }
});