在openlayers库源代码中混淆使用bind

时间:2019-01-08 09:17:22

标签: bind openlayers-5

我正在研究return JavaScript库的源代码。在openlayers的文件中,我发现以下内容:

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)。这两个方法只是在CartoDB类中定义的。

那为什么要这样处理呢?

1 个答案:

答案 0 :(得分:1)

可以与这两种情况相比较

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"