2014-10-19 2 views
0

Я работаю над учебным пособием по расширению Chrome (полный код ниже). Существует одна вещь, которую я не понимаю, по этому поводу, что связано с линии 3 метода requestKittensОбъясните, где «это» указывает на

 req.onload = this.showPhotos_.bind(this); 

и линии 1 метода showPhotos:

 var kittens = e.target.responseXML.querySelectorAll('photo'); 

Я пытаюсь понять, как e.target.responseXML указывает на ответ XML запроса. Вот что я думаю до сих пор: в строке, которая вызывает эту функцию (3-я строка requestKittens()), this указывает на объект kittenGenerator, что означает, что kittenGenerator привязан как первый аргумент для showPhotos(). Итак, аргумент e в showPhotos() должен быть kittenGenerator, правильно?

Если это правда, то первая линия showPhotos() ...

var kittens = e.target.responseXML.querySelectorAll('photo'); 

... говорит, что kittenGenerator имеет свойство target. Однако я проверил это на консоли Chrome, и это не так, поэтому в моей логике есть ошибка. Любой, кто может помочь?

// Copyright (c) 2012 The Chromium Authors. All rights reserved. 
// Use of this source code is governed by a BSD-style license that can be 
// found in the LICENSE file. 

/** 
* Global variable containing the query we'd like to pass to Flickr. In this 
* case, kittens! 
* 
* @type {string} 
*/ 
var QUERY = 'kittens'; 

var kittenGenerator = { 
    /** 
    * Flickr URL that will give us lots and lots of whatever we're looking for. 
    * 
    * See http://www.flickr.com/services/api/flickr.photos.search.html for 
    * details about the construction of this URL. 
    * 
    * @type {string} 
    * @private 
    */ 
    searchOnFlickr_: 'https://secure.flickr.com/services/rest/?' + 
     'method=flickr.photos.search&' + 
     'api_key=90485e931f687a9b9c2a66bf58a3861a&' + 
     'text=' + encodeURIComponent(QUERY) + '&' + 
     'safe_search=1&' + 
     'content_type=1&' + 
     'sort=interestingness-desc&' + 
     'per_page=20', 

    /** 
    * Sends an XHR GET request to grab photos of lots and lots of kittens. The 
    * XHR's 'onload' event is hooks up to the 'showPhotos_' method. 
    * 
    * @public 
    */ 
    requestKittens: function() { 
    var req = new XMLHttpRequest(); 
    req.open("GET", this.searchOnFlickr_, true); 
    req.onload = this.showPhotos_.bind(this); 
    req.send(null); 
    }, 

    /** 
    * Handle the 'onload' event of our kitten XHR request, generated in 
    * 'requestKittens', by generating 'img' elements, and stuffing them into 
    * the document for display. 
    * 
    * @param {ProgressEvent} e The XHR ProgressEvent. 
    * @private 
    */ 
    showPhotos_: function (e) { 
    var kittens = e.target.responseXML.querySelectorAll('photo'); 
    for (var i = 0; i < kittens.length; i++) { 
     var img = document.createElement('img'); 
     img.src = this.constructKittenURL_(kittens[i]); 
     img.setAttribute('alt', kittens[i].getAttribute('title')); 
     document.body.appendChild(img); 
    } 
    }, 

    /** 
    * Given a photo, construct a URL using the method outlined at 
    * http://www.flickr.com/services/api/misc.urlKittenl 
    * 
    * @param {DOMElement} A kitten. 
    * @return {string} The kitten's URL. 
    * @private 
    */ 
    constructKittenURL_: function (photo) { 
    return "http://farm" + photo.getAttribute("farm") + 
     ".static.flickr.com/" + photo.getAttribute("server") + 
     "/" + photo.getAttribute("id") + 
     "_" + photo.getAttribute("secret") + 
     "_s.jpg"; 
    } 
}; 

// Run our kitten generation script as soon as the document's DOM is ready. 
document.addEventListener('DOMContentLoaded', function() { 
    kittenGenerator.requestKittens(); 
}); 
+0

e - это параметр события, а 'e.target' указывает на объект, в котором запущено событие' onload', которое является объектом 'req'. –

+0

Вы должны помнить, что '.bind()' принимает 'thisArg' перед списком связанных аргументов, что и будет связано с этим значением this в функции. –

+0

http://stackoverflow.com/questions/4195970/what-does-this-mean – Paul

ответ

0

Первый параметр bind определяет контекст частичного применения.

req.onload = this.showPhotos_.bind(this); 

работает, потому что XMLHttpRequest использует событие в качестве первого параметра на это onload обработчик. Вот откуда берет e.target.

Чтобы дать вам простой пример привязки, рассмотрит следующее: (т. Е что-то другое, чем нуль)

function add(a, b) { 
    return a + b; 
} 

var addTwo = add.bind(null, 2); 
addTwo(10); // yields 12 

Если определить контекст для привязки, то вы можете получить доступ к этому контексту, используя this в пределах функция.

+0

Ах хорошо, так что в строке ... 'req.onload = this.showPhotos_.bind (это);' ... 'kittenGenerator.showPhotos()' устанавливается для выполнения при onload, но с 'this' установлено равным' this' в контексте этой строки, что равно 'kittenGenerator'. Это верно? – guzman

+0

Да. В этом-то и дело. Именно по этой причине я предпочитаю избегать использования 'this', поскольку он просто добавляет ненужную путаницу в код. –

+0

Другая запутанная часть этого заключается в том, что 'onload' автоматически использует событие в качестве параметра в назначенной функции ... Я играл с этим в хром-консоли и думаю, что получаю его сейчас, но довольно странно. В любом случае спасибо за помощь. – guzman

Смежные вопросы