绑定

时间:2015-12-09 10:18:40

标签: javascript

我知道在这个问题上有很多关于堆栈的类似问题,但对于我的生活,我无法理解代码中的问题。

尝试在javascript中升级,以便任何建议都会有所帮助。我创建了一个管理滑块功能的对象。

    var gMapSlider = {
        mapSlideShow: false,
        // why doesnt current place update when passed in
        newMarker: null,
        oldMarker: null,
        mapSlideIn: function() {
            this.contentSlide
            $('#placeDetails').animate({right: '0'});
            this.mapSlideShow = true;
        },
        mapSlideOut: function(func) {
            if (typeof(func) != "function") func = function() {};
            $('#placeDetails').animate({right: '-320px'}, null, null, func());
            this.mapSlideShow = false;
        },

        mapSlideToggle: function() {
            (this.mapSlideShow) ? this.mapSlideOut() : this.mapSlideIn();
        },

        contentSlide: function() {
            if (this.newMarker) $('h1', '#placeDetails').text(this.newMarker.title);
        },

        mapSlide: function(marker) {
            this.newMarker = marker;
            if (this.oldMarker === this.newMarker) { //same marker showing
                this.mapSlideToggle();
            }
            else if (this.oldMarker !== this.newMarker && !this.mapSlideShow) { //diff marker showing
                this.contentSlide(marker);
                this.mapSlideIn();
            }
            else if (this.oldMarker !== this.newMarker && this.mapSlideShow)   {
                var self = this;
                console.log(self) //returns this object
                this.mapSlideOut(function() {
                    console.log(self); // returns this object
                    self.contentSlide(this.newMarker);
                    self.mapSlideIn;
                }).bind(self); // cannot read property 'bind' of undefined
            } 
            this.oldMarker = this.newMarker;
        }
    }

几个问题

1)问题在于我的gMapSlider.mapSlide函数。如果我调用mapSlide函数并且最后一个else if语句适用,我得到一个无法读取绑定错误的属性。我有谷歌,但没有发现任何真正的相关性。任何人都可以帮助我在这里做错了。

2)这是管理命名空间内功能的最佳方式。我看到的大多数代码示例都在全局命名空间中使用函数,所以如果建议在Javascript中创建这样的对象,需要做一些澄清吗?

编辑@torazaburo谢谢,感觉像一个合适的新手,这就是问题所在。把它作为答案,我将解决。有关代码架构的任何建议吗?

1 个答案:

答案 0 :(得分:1)

 this.mapSlideOut(function() {
                    console.log(self); // returns this object
                    self.contentSlide(this.newMarker);
                    this.mapSlideIn;
                }).bind(self);
应该在函数对象上调用

bind(),但是你在函数调用的结果上调用它

使用它:

 this.mapSlideOut.bind(self,function() {
                    console.log(this); // returns this object
                    this.contentSlide(this.newMarker);
                    this.mapSlideIn;
                });

同样,上面的调用将返回对该函数的引用,并将其绑定到self