为什么我的变量Underscore.js内未定义的每个函数?(Why is my variable

2019-08-02 16:15发布

这里是我的代码:

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是不确定的,当我进入循环。

Answer 1:

在JavaScript中,函数上下文,被称为this ,作品却截然不同 。

您可以通过两种方式解决这个问题:

  1. 使用一个临时变量来存储上下文:

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

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


Answer 2:

你必须通过this作为上下文_.each调用是这样的:

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

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



Answer 3:

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;
    }
};


Answer 4:

请注意,您还可以通过其他的事情,“本”。 例如,我做这样的事情:

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);


文章来源: Why is my variable undefined inside the Underscore.js each function?