TypeError:无法设置属性" STRING" STRING的未定义(Javascript)

时间:2015-12-01 04:06:01

标签: javascript

我有这个"课程":

function BooleanAssoc(keyNames) {
    this.assoc = {};
    $.each(keyNames, function(i, val) {
        this.assoc[val] = false;
    });
};

我这样用:

var signUpStates = new BooleanAssoc([
    "CNPJ", 
    "PASSWORDS", 
    "ADDRESS", 
    "GENERAL_FIELDS", 
    "STATE", 
    "CITY", 
    "SEGMENT", 
    "PRODUCT",
    "EMAIL",
    "TERMS"
]);

我不明白为什么会遇到TypeError。也许我的想法也是#pythonic"。我创建了一个字典("关联数组"),我遍历一个字符串列表并创建键并相应地分配它们的值。我做错了什么?

3 个答案:

答案 0 :(得分:4)

您的this不是您期望的this

尝试:

function BooleanAssoc(keyNames) {
  this.assoc = {};

  $.each(keyNames, function(i, val) {
    this.assoc[val] = false;
  }.bind(this));
};

ES5环境,您也可以使用.forEach。如果使用ES6,则可以使用不绑定this的箭头函数并使用父作用域:

function BooleanAssoc(keyNames) {
  this.assoc = {};

  keyNames.forEach(val => {
    this.assoc[val] = false;
  });
};

您也可以执行以下操作,但通常认为这不是最佳做法,因为它会不必要地将变量引入范围。但是,如果您在ES3等环境中,并且无法使用填充程序添加ES5功能,则以下内容将起作用:

function BooleanAssoc(keyNames) {
  var self = this;
  this.assoc = {};

  $.each(keyNames, function(i, val) {
    self.assoc[val] = false;
  });
};

答案 1 :(得分:0)

这应该有效:

function BooleanAssoc(keyNames) {
    this.assoc = {};
    $.each(keyNames, function(i, val) {
        this.assoc[val] = false;
    }.bind(this));
};

答案 2 :(得分:0)

我认为这与上下文有关。每个this内部都是指当前值而不是类BooleanAssoc的上下文。

function BooleanAssoc(keyNames) {
    var self = this;
    self.assoc = {};
    $.each(keyNames, function(i, val) {
        self.assoc[val] = false;
    });
};

尝试上面一个。