首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何避免对每个函数绑定(这)?

如何避免对每个函数绑定(这)?
EN

Stack Overflow用户
提问于 2015-06-18 10:12:42
回答 2查看 1.3K关注 0票数 11

我正在实现一个建立在OpenLayers3之上的web地图客户端,它应该能够连接到多个WMS服务器,请求WMS功能,并显示服务器所宣传的层。

代码语言:javascript
复制
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));
};

上面的代码工作得很好,但是每次我想调用一个需要访问MyMapClient实例的“私有”变量的函数时,我都必须使用MyMapClient。难道没有更好的方法来一致地访问实例内部,而不牺牲可读性吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-06-18 10:34:57

我想说的是,使用这两个世界中的最好的,即保存正确范围的局部变量,并在需要时调用bind()

代码语言:javascript
复制
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
        );
    });
};
票数 7
EN

Stack Overflow用户

发布于 2015-06-18 10:30:02

您可以“硬绑定”这样的方法:

代码语言:javascript
复制
function Foo() {
    this.bar = this.bar.bind(this);
}

Foo.prototype.bar = function() {
    return console.log(this.baz);
};

顺便说一句,这就是CoffeeScript在执行此操作时所编译的内容:

代码语言:javascript
复制
class Foo
  bar: =>
    console.log @baz

=>操作符会导致上下文的保存。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30912506

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档