在一种计算面积的方法中,在定义变量时,我使用 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();
答案 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
,而您没有在任何地方声明Rectangle
或height
,而且他们表面上是在{{{{}}范围内声明自己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 =
。在这种情况下,变量不会从函数中泄漏出来,只是一个局部变量。