0

我正在学习 udacity 的课程并遇到问题。

https://www.udacity.com/course/viewer#!/c-cs255/l-49464373/e-73862317/m-73162952

function xhrGet(reqUri,callback) {
    var xhr = new XMLHttpRequest();

    xhr.open("GET", reqUri, true);
    xhr.onload = callback;

    xhr.send();
}

var TILEDMapClass = Class.extend({

    // Boolean flag we set once our map atlas
    // has finished loading.
    fullyLoaded: false,

    //-----------------------------------------
    // Load the json file at the url 'map' into
    // memory. This is similar to the requests
    // we've done in the past using
    // XMLHttpRequests.
    load: function (map) {

        // Perform an XMLHttpRequest to grab the
        // JSON file at url 'map'. We've provided
        // the xhrGet function from the optional
        // unit for you to use if you want.
        //
        // Once the XMLHttpRequest loads, set the
        // 'fullyLoaded' flag to true.
        //
        // YOUR CODE HERE
        xhrGet(map, function(){
            this.fullyLoaded = true;
        });
    }

});

// We define a single global instance of our
// map for the rest of our game code to access.
var gMap = new TILEDMapClass();

该链接说它使用gMap.load.apply(gMap, [jsonURL]); http://forums.udacity.com/questions/100058023/scope-of-this#cs255

但我认为尽管使用了被调用的方法。(负载将属于gMap)

但是因为

xhr.onload = function(){
                this.fullyLoaded = true;
            }

是属于 xhr 对象的方法,

并且在this一个匿名函数中

应该引用 xhr而this不是 gMap。

为什么要this参考 gMap?

4

3 回答 3

2

在闭包中很有趣。您必须记住 this 关键字通常指的是方法的所有者。通常是调用者(全局函数的窗口),但是当方法作为对象的属性被调用时,this 将引用对象本身。

请参阅:“如果函数作为父级的属性调用,则 this 指的是函数代码中的父级对象。” 了解这一点

直接来自理解的规则:

  • 默认情况下,this 指的是全局对象。
  • 当函数作为父对象的属性调用时,this 指的是该函数内的父对象。
  • 当使用 new 运算符调用函数时,this 指的是该函数内新创建的对象。
  • 当使用 call 或 apply 调用函数时,this 指的是传递给 call 或 apply 的第一个参数。如果第一个参数为 null 或不是对象,则 this 指的是全局对象。
于 2013-10-03T17:09:14.133 回答
1

this并不一定意味着它被调用的函数或对象,如果您习惯使用 jQuery 并且对此感到困惑,this为了方便起见,jQuery 方法实际上设置在其所有函数上,方法是调用这两个函数之一,这些函数设置this为呼叫者,召集者:

call(object, arg0, arg1...);
apply(object, args[]);

所以基本上,除非函数是this通过调用上述函数之一来设置的,否则它将被设置为一些外部函数/对象或window.

于 2013-10-03T17:09:08.040 回答
1

javascript函数中的“this”与函数所属的对象无关,而是针对它执行的对象

与 Java 相比,它们是相同的,因为方法确实是对象的一部分,没有它就不能存在(不考虑静态)。

例如:

var blah = {
  test: function () {
    console.log('test');
  }
};
var f = blah.test;
var bleh = {
  test: blah.test
}

如果然后我进行这三个函数调用中的每一个,那么每个调用中的“this”指向什么?

blah.test();  // this points to blah
f();          // this is null (or undefined, not sure which)
bleh.test();  // this is bleh

我还可以使用 Function.call 在任何对象的上下文中调用函数对象:https ://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/call

f.call(window);  // this is window

使用回调时很难理解“this”,因为回调函数通常由其他一些库(例如 jquery)调用,并且它们的 API 可能会或可能不会保证“this”指的是什么。您可以做些什么作为解决方法:

someAsyncFunction(function () {
  bleh.test();
});

这将确保使用可预测的“this”引用调用您关心的函数。

于 2013-10-03T17:15:11.020 回答