0

私は大胆さのコースを研究していて、問題に遭遇しました。

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無名関数の中にあります

thisgMap ではなく xhr を参照する必要があります。

なぜthis参照 gMap なのですか?

4

3 に答える 3

2

これはクロージャ内で面白いです。this キーワードは通常、メソッドの所有者を参照することを覚えておく必要があります。通常は呼び出し元 (グローバル関数のウィンドウ) ですが、メソッドがオブジェクトのプロパティとして呼び出される場合、これはオブジェクト自体を参照します。

これを参照してください:「これは、関数が親のプロパティとして呼び出された場合、関数コード内の親オブジェクトを参照します。」これを理解する

これを理解することから直接ルール:

  • デフォルトでは、これはグローバル オブジェクトを参照します。
  • 関数が親オブジェクトのプロパティとして呼び出されると、これはその関数内の親オブジェクトを参照します。
  • 関数が new 演算子で呼び出されると、これはその関数内で新しく作成されたオブジェクトを参照します。
  • 関数が call または apply を使用して呼び出される場合、これは call または apply に渡される最初の引数を参照します。最初の引数が null またはオブジェクトでない場合、これはグローバル オブジェクトを参照します。
于 2013-10-03T17:09:14.133 に答える
1

JavaScript関数の「this」は、関数が属するオブジェクトとは関係ありませんが、どのオブジェクトに対して実行されますか

Java とは対照的です。メソッドは真にオブジェクトの一部であり、メソッドなしでは存在できない (静的を考慮しない) ため、それらは同じです。

例えば:

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

次に、これら 3 つの関数呼び出しをそれぞれ行う場合、各呼び出しで「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

コールバック関数は通常、他のライブラリ (たとえば jquery など) によって呼び出され、それらの API は「これ」が何を指すかを保証する場合と保証しない場合があるため、コールバックを使用する場合、「これ」を理解することは困難です。回避策としてできること:

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

これにより、関心のある関数が予測可能な「this」参照で呼び出されるようになります。

于 2013-10-03T17:15:11.020 に答える
1

thisjQuery の使用に慣れていて、これに混乱している場合、jQuery メソッドはthis、これらの 2 つの関数のいずれかを呼び出すことにより、便宜上すべての関数に実際に設定thisされます。呼び出し側:

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

したがって、基本的に、関数がthis上記の関数のいずれかを呼び出すことによって設定されていない限り、外部の関数/オブジェクトまたは に設定されますwindow

于 2013-10-03T17:09:08.040 に答える