使用此方法访问变量将在map中返回undefined

时间:2016-09-26 21:01:12

标签: javascript variables scope this

我收到错误:

Uncaught TypeError: Cannot read property '1' of undefined 

运行以下内容时:

function Polygon(width, height) {
  this.width = width;
  this.height = height;
  this.a = [1, 2, 3, 4, 5];

  this.build = function() {
    this.a.map(function(i, v) {
      console.log(this.a[v])
    });
  }
}

var square = new Polygon(300, 300);
square.build();

只有在尝试引用this.aArray.prototype.map等数组函数中的reduce变量时才会出现这种情况。但是,代码在将变量存储在局部变量中时起作用,如下所示:

function Polygon(width, height) {
  this.width = width;
  this.height = height;
  this.a = [1, 2, 3, 4, 5];

  this.build = function() {
    var b = this.a;
    b.map(function(i, v){
      console.log(b[v])
    });
  }
}

var square = new Polygon(300,300);
square.build();

我的问题是:

  • 为什么我收到此错误?
  • 是否有更好的方式来访问'班级'变量?
  • 这可能是JavaScript范围错误吗?

1 个答案:

答案 0 :(得分:5)

根据Array.prototype.map的{​​{3}}:

  

如果提供了thisArg参数进行映射,则会在调用时将其传递给回调,以用作此值。 否则,将传递undefined值以用作此值。(强调添加)

这意味着this函数中的map未定义,因此您尝试在undefined上使用括号表示法。这会产生TypeError,表示您正在尝试访问undefined的属性。

您也错误地使用了ii是实际的元素或项,而不是索引。您只需记录i,不要记下a

function Polygon(width, height){
  this.width = width;
  this.height = height;
  this.a = [1, 2, 3, 4, 5];

  this.build = function(){
    this.a.map(function(i, v){
      console.log(i);
    }, this);
  }
}

var square = new Polygon(300, 300);
square.build();

这会将可选的thisArg作为Polygon的上下文传递并正确记录。该参数明确指出this上下文,允许访问this.a