запутанное использование связывания в исходном коде библиотеки openlayers - PullRequest
0 голосов
/ 08 января 2019

Я просматриваю исходный код библиотеки openlayers javascript. И в файле source/CartoDB.js я нахожу что-то следующее:

class CartoDB extends XYZ {
  constructor () {}
  initializeMap_() {
    ...
    const client = new XMLHttpRequest();
    client.addEventListener('load', this.handleInitResponse_.bind(this, paramHash));
    client.addEventListener('error', this.handleInitError_.bind(this));
    client.open('POST', mapUrl);
    client.setRequestHeader('Content-type', 'application/json');
    client.send(JSON.stringify(this.config_));
  }

  handleInitResponse_(paramHash, event) {
    ...
  }

  handleInitError_(event) {
    ...
  } 
}

Я очищаю код и удаляю несвязанный код для моего вопроса.
Меня сбивает с толку следующие две строки:

client.addEventListener('load', this.handleInitResponse_.bind(this, paramHash));
client.addEventListener('error', this.handleInitError_.bind(this));

Я думаю, this.handleInitResponse_.bind(this, paramHash) просто равно this.handleInitResponse_ и this.handleInitError_.bind(this) просто равно this.handleInitError_. И эти два метода просто определены в классе CartoDB.

Так зачем обращаться с этим так?

1 Ответ

0 голосов
/ 09 января 2019

Это сопоставимо с этими двумя сценариями

var myObject = {
    readyState: "myObject",
    errorHandler: function() { console.log(this.readyState) },
    initialize: function() {
       var xhr = new XMLHttpRequest();
       xhr.addEventListener('error',this.errorHandler);
       xhr.open("GET", "http://invalid.com/invalid.dat", true);
       xhr.send();
    }
}
myObject.initialize(); // logs "4"

var myObject = {
    readyState: "myObject",
    errorHandler: function() { console.log(this.readyState) },
    initialize: function() {
       var xhr = new XMLHttpRequest();
       xhr.addEventListener('error',this.errorHandler.bind(this));
       xhr.open("GET", "http://invalid.com/invalid.dat", true);
       xhr.send();
    }
}
myObject.initialize(); // logs "myObject"
...