在JS中使用这个?

时间:2015-08-31 13:44:00

标签: javascript oop methods this

在一种计算面积的方法中,在定义变量时,我使用 this 而在其他方面(在计算周长时)我没有(如代码所示)。 2个变量之间有什么区别(有和没有这个?)

function Rectangle(height, width) {
  this.height = height;
  this.width = width;
  this.calcArea = function() {
      this.areaRec = this.height * this.width; //here "this" is used for the variable areaRec to calculate & be returned
      return this.areaRec;
  };


  this.calcPerimeter = function() {
      perimeter = (2*(this.height + this.width)); //here without "this" the varible is caculated and returned; both returns correct result
      return perimeter;
  };
}

var rex = new Rectangle(7,3);

var area = rex.calcArea();
var perimeter = rex.calcPerimeter();

3 个答案:

答案 0 :(得分:1)

在calcArea中,除了返回计算结果外,还要在Rectangle对象的areaRec属性上设置计算结果(使其可在Rectangle.areaRec上访问)。在calcPerimeter中,您只是返回计算结果(请注意,calcPerimeter未在函数中定义,因此它将成为窗口对象的全局属性)。

答案 1 :(得分:0)

这是范围的差异。您在$ cd installdir $ ./use_redmine $ cd apps/redmine/htdocs $ bundle install --without development test $ bundle exec rake redmine:plugins NAME=redmine_agile RAILS_ENV=production 函数之外声明了perimeter,而您没有在任何地方声明Rectangleheight,而且他们表面上是在{{{{}}范围内声明自己1}}。

width函数之外尝试Rectangle,您应该在控制台中获得“未定义”。

如果您删除了console.log(height);Rectangle()并将行perimeter =更改为两行:

return perimeter

然后var perimeter = rex.calcPerimeter()之后,你仍然应该得到你要返回的值,因为var perimeter; rex.calcPerimeter();的范围是全局的。

答案 2 :(得分:0)

使用this.areaRec =时,您要为this引用的对象添加新字段。致电smth.calcArea()后,您就可以从其他任何地方阅读smth.areaRec

使用perimeter =时,您正在window创建此类媒体资源。因此,在致电smth.calcPerimeter()之后,您将能够从其他任何地方阅读window.perimeter或名为perimeter的全局变量。

正确的方法是将变量声明为var perimeter =。在这种情况下,变量不会从函数中泄漏出来,只是一个局部变量。