Why is my variable undefined inside the Underscore.js each function?

前端 未结 4 638
無奈伤痛
無奈伤痛 2021-02-05 08:32

Here is my code:

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

TextClass.prototype = {
    SetTexts: function (texts) {
        for (var i = 0; i < te         


        
相关标签:
4条回答
  • 2021-02-05 08:34

    this in javascript does not work the same way as you would expect. read this article: http://www.digital-web.com/articles/scope_in_javascript/

    short version:

    the value of this changes every time you call a function. to fix, set another variable equal to this and reference that instead

    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;
        }
    };
    
    0 讨论(0)
  • 2021-02-05 08:35

    In JavaScript, the function context, known as this, works rather differently.

    You can solve this in two ways:

    1. Use a temporary variable to store the context:

      SetTexts: function (texts) {
        var that = this;
        _.each(texts, function (text) {
          that._textArr[text.Key] = text.Value;
        });
      }
      
    2. Use the third parameter to _.each() to pass the context:

      SetTexts: function (texts) {
        _.each(texts, function (text) {
          this._textArr[text.Key] = text.Value;
        }, this);
      }
      
    0 讨论(0)
  • 2021-02-05 08:47

    You have to pass this as context for _.each call like this:

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

    See the docs for http://underscorejs.org/#each

    0 讨论(0)
  • 2021-02-05 08:48

    Note that you can also pass things other that "this". For example, I do something like:

    var layerGroupMasterData = [[0],[1,2,3],[4,5],[6,7,8,9],[10]];
    
    _.each(layerGroupMasterData,function(layerGroup,groupNum){
        _.each(layerGroup, function (layer, i) {
                doSomethingThatComparesOneThingWithTheOverallGroup(layerGroupMasterData,layer);
        },layerGroups);
    },layerGroupMasterData);
    
    0 讨论(0)
提交回复
热议问题