【问题标题】:Give "x" on this.x a variable value when passing objects to an array将对象传递给数组时,在 this.x 上给“x”一个变量值
【发布时间】:2015-03-08 12:26:25
【问题描述】:

我在 Stackoverflow 上的多个问题中看到,我可以将变量传递给 this 关键字:

name = "world";
alert("Hello " + this.name);

但是,我正在为以下代码苦苦挣扎:

$('.test').click(function() {
    var data = $(this).data();
    var type = data.type;

    $('#world-map-geo1').empty();

    $.getJSON('json/geoCountries-' + site + '.json', function (pushArray) {
        var countryData = [];
        console.log(type);
        $.each(pushArray, function() {
            // Following line doesn't make what I expect.
            countryData[this.countryIsoCode] = this.type;
            // alert(this.type)
        });
        console.log(countryData);
    });
});

当我点击一个 li, f.i. 时该函数被执行:

<li class="test" data-type="sessions">Sessions</li>

我得到了未定义的值,因为 this.type 似乎没有被转换为 this.sessions。但是,如果我手动将 this.type 更改为 this.sessions,它可以正常工作。

我知道这不是变量范围的问题,就好像我将 this.type 替换为仅类型一样,我在每个数组对象上都获得了“会话”。

我完全确定,问题在于我对 jquery 的了解有限,以及这个关键字如何用于这种特定方法,虽然我没有尝试过,但我相信如果我的 json 中有一个名为 type 的对象,这个.type 将采用这些值而不是 this.sessions 中的值。

【问题讨论】:

  • 一般来说this指的是调用函数的人。所以你的第一个this 是被点击的元素,但getJSON() 中的第二个this 指的是内部函数。如果要在内部函数中引用外部this,则需要将其作为变量传递。
  • 'countryIsoCode' 来自哪里..?我猜你可以在你的内部函数中直接使用'type'而不是this.type..!
  • name = "world"; 创建(在非严格模式下)一个全局变量,这很糟糕。然后,如果没有设置this,则为window(在非严格模式下)。因此,this.name 将类似于window.name,您将获得您的价值。但不要那样做。
  • 如果您不向我们展示您的 JSON(或者最好是它的代表性样本),我们将无法帮助您。为什么要将data.type 分配给一个变量,然后什么都不做(除了将它打印到控制台)?

标签: javascript jquery this scope


【解决方案1】:

所以首先是这一行:

var type = data.type;

应该是

this.type = data.type;

在您上面的代码中,'this' 将引用 $('.test'),即使用带有类 'test' 的 dom 元素创建的 jQuery 对象。

对于您稍后拥有的数组,您需要确保内部函数的范围知道其父“this”上下文。这通常是通过将内部函数绑定到其父函数来完成的。

看起来像这样

$.method = func(){}.bind(this);

另外,关于 var countryData = []; AND countryData[this.countryIsoCode] = this.type;

您可能需要将 countryData 变成一个对象,以便

var countryData = {};

我建议阅读数组和对象之间的差异,即 [] 与 {}。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多