为什么我的变量undefined在Underscore.js中的每个函数中?

这是我的代码:

TextClass = function () {
    this._textArr = {};
};

TextClass.prototype = {
    SetTexts: function (texts) {
        for (var i = 0; i < texts.length; i++) {
            this._textArr[texts[i].Key] = texts[i].Value;
        }
    },
    GetText: function (key) {
        var value = this._textArr[key];
        return String.IsNullOrEmpty(value) ? 'N/A' : value;
    }
};

我正在使用Underscore.js库,并希望像这样定义我的SetTexts函数:

_.each(texts, function (text) {
    this._textArr[text.Key] = text.Value;
});

但是当我进入循环时_textArr是未定义的。


在JavaScript中,函数上下文(称为this )的工作原理相当不同。

你可以用两种方法解决这个问题:

  • 使用临时变量来存储上下文:

    SetTexts: function (texts) {
      var that = this;
      _.each(texts, function (text) {
        that._textArr[text.Key] = text.Value;
      });
    }
    
  • 使用第三个参数_.each()传递上下文:

    SetTexts: function (texts) {
      _.each(texts, function (text) {
        this._textArr[text.Key] = text.Value;
      }, this);
    }
    

  • 你必须将this作为_.each上下文来调用,如下所示:

    _.each(texts, function (text) {
        this._textArr[text.Key] = text.Value;
    }, this);
    

    请参阅http://underscorejs.org/#each的文档


    this在JavaScript中不会像你所期望的那样工作。 阅读这篇文章:http://www.digital-web.com/articles/scope_in_javascript/

    简洁版本:

    this改变每次调用一个函数的时间。 修复,设置另一个变量等this并引用它

    TextClass = function () {
        this._textArr = {};
    };
    
    TextClass.prototype = {
        SetTexts: function (texts) {
            var that = this;
            for (var i = 0; i < texts.length; i++) {
                that._textArr[texts[i].Key] = texts[i].Value;
            }
        },
        GetText: function (key) {
            var value = this._textArr[key];
            return String.IsNullOrEmpty(value) ? 'N/A' : value;
        }
    };
    
    链接地址: http://www.djcxy.com/p/94905.html

    上一篇: Why is my variable undefined inside the Underscore.js each function?

    下一篇: How is 'this' working in this context?