【发布时间】: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