如何避免在每个函数上绑定(this)?

Pet*_*vac 11 javascript bind

我正在实现一个构建在OpenLayers3之上的Web地图客户端,它应该能够连接到多个WMS服务器,请求WMS功能并显示服务器通告的层.

var MyMapClient = function(params) {
    this.wms_sources_ = params.wms_sources;
    this.wms_capabilities_ = [];
}

MyMapClient.prototype.parse_capabilities = function(index) {
    var capabilities = this.wms_capabilities_[index];
    // do something with capabilities 
}

MyMapClient.prototype.load_wms_capabilities = function() {
    var parser = new ol.format.WMSCapabilities();

    jQuery.each(this.wms_sources_, (function (index, wms_source) {

        console.log("Parsing " + wms_source.capabilities_url);

        jQuery.when(jQuery.ajax({
            url: wms_source.capabilities_url,
            type: "GET",
            crossDomain: true,
        })).then((function (response, status, jqXHR) {
            var result = parser.read(response);
            console.log("Parsed Capabilities, version " + result.version);
            this.wms_capabilities_[index] = result;
            return index;
        }).bind(this)).then(this.parse_capabilities.bind(this));

    }).bind(this));
};
Run Code Online (Sandbox Code Playgroud)

上面的代码运行正常,但我bind(this)每次都想调用一个需要访问MyMapClient实例的"私有"变量的函数.是否有更好的方法可以一致地访问实例内部,而不会牺牲可读性?

Mat*_*ari 7

我会说使用两个世界中最好的,即一个保持正确范围的局部变量,并调用bind()所需的地方:

MyMapClient.prototype.load_wms_capabilities = function() {
    var parser = new ol.format.WMSCapabilities(),
        _this = this;

    jQuery.each(this.wms_sources_, function (index, wms_source) {
        console.log("Parsing " + wms_source.capabilities_url);

        jQuery.when(jQuery.ajax({
            url: wms_source.capabilities_url,
            type: "GET",
            crossDomain: true,
        })).then(function (response, status, jqXHR) {
            var result = parser.read(response);
            console.log("Parsed Capabilities, version " + result.version);
            _this.wms_capabilities_[index] = result;
            return index;
        }).then(
          function() { return _this.parse_capabilities(); }
          // or else
          // _this.parse_capabilities.bind(_this)
          // pick the one you like more
        );
    });
};
Run Code Online (Sandbox Code Playgroud)

  • 这看起来像现在最干净/最容易阅读的方法.不确定为什么它会吸引一个downvote ... (2认同)