javascript对象变量范围

时间:2014-03-11 13:43:20

标签: javascript oop scope

我有一个MessageHelper对象,它有一个idx var。现在我想从索引方法访问和修改它。我认为'这个'可以,但我得到了NaN。任何线索?

var MessageHelper = {
        idx: 8,
        formatDate: function(){
            return function(text, render) {
                // // parse date
                var date = $.trim(render(text));
                var mom = moment(date);
                return mom.format("D/M/YY");
            }
        },
        formatDateTime: function(){
            [...]
        },      
        getImportance: function(){
            [...]
        },
        index: function(){
            return function(text, render) {
                this.idx++;
                return this.idx;
            }
        }
    }   

2 个答案:

答案 0 :(得分:2)

函数内this的值取决于函数的调用方式。如果您希望始终使用特定值this调用函数,最简单的方法是使用Function.prototype.bind

    index: function(){
        return function(text, render) {
            this.idx++;
            return this.idx;
        }.bind(this); // <--- HERE
    }

在这个例子中,我依赖于外部函数将被调用的事实:

MessageHelper.index()

所以在其中,this实际上是MessageHelper。因此,MessageHelper也将在索引返回的函数内this

如果你打算做某些事情,比如将索引函数作为参数传递给某个地方,它就不会按预期调用,整个事情都会失败。在这种情况下,您应该绑定到MessageHelper:

var MessageHelper = {
  index : function(){}.bind(MessageHelper);
}

var myIndex = MessageHelper.index;
myIndex(); // this will return the correct function, bound to MessageHelper

答案 1 :(得分:1)

this返回的函数内的范围(index)是函数本身。外部索引,this指的是MessageHelper

所以基本上你必须做类似的事情:

var MessageHelper = {
        idx: 8,
        index: function(){
            var self = this; // MessageHelper
            return function(text, render) {
                self.idx++;
                return self.idx;
            }
        }
    }   

您也可以使用bind,但旧浏览器不支持此功能。

提示:如果您没有定义构造函数,则约定是使用小写命名对象。在你的情况下messageHelper。