JavaScript构造函数:这是属性还是变量?

时间:2016-10-17 23:00:28

标签: javascript

我在canvas元素上冲浪,与JavaScript游戏一起使用,我发现了这段代码:

    public class Triangle extends GeometricObject {
private double side1 ;
private double side2 ;
private double side3 ;
public final double DEFAULT = 1.0;

public Triangle(){
    super();
    side1= DEFAULT;
    side2= DEFAULT;
    side3= DEFAULT;
}
public Triangle(String color, boolean filled, double side1, double side2, double side3)throws IllegalTriangleException{
    super(color,filled);
    this.side1=side1;
    this.side2=side2;
    this.side3=side3;
    if (side1>=side2+side3||side2>=side1+side3|| side3>=side1+side2){
        throw new IllegalTriangleException(side1,side2,side3);
    }
}
public double getSide1() {
    return side1;
}
public void setSide1(double side1) {
    this.side1 = side1;
}
public double getSide2() {
    return side2;
}
public void setSide2(double side2) {
    this.side2 = side2;
}
public double getSide3() {
    return side3;
}
public void setSide3(double side3) {
    this.side3 = side3;
}
public double getArea(double s1, double s2, double s3){
    side1= s1;
    side2= s2;
    side3= s3;
    double area = .5*(s1*s2*s3);
    return area;
}
public double getPerimeter(double s1, double s2, double s3){
    side1=s1;
    side2=s2;
    side3=s3;
    double perim = s1+s2+s3;
    return perim;
}
public String toString(){

    return super.toString()+ "triangle side 1 +"+ side1+ " side 2= "+side2+" side 3= "+side3;
}
public boolean equals(Object o){

}
  }


public class TestTriangle {
public void main (String[]args){
    try {
        GeometricObject tri1 = new Triangle ("yellow",true,1.0,1.5,1.0);
        GeometricObject tri2 = new Triangle ("red ", true, 2.0,3.7,5.0);
    } catch (IllegalTriangleException e) {
        System.out.print("invalid Side Lengths");
    }


}
}   

我的问题是function component(width, height, color, x, y) { this.width = width; this.height = height; this.x = x; this.y = y; ctx = myGameArea.context; // **why not: var ctx= myGameArea.context ???** ctx.fillStyle = color; ctx.fillRect(this.x, this.y, this.width, this.height); } 属性是什么?还是私人变量?

ctx未在此构造函数之外声明或使用(例如:ctx)。它只在这段代码中。

我听说如果你直接设置一个没有var ctx保留字的值的变量,你就是在声明一个全局变量。但是var变量没有在构造函数之外使用,所以没用吗?

当将ctx属性设置为对象的实例时,它们也会做同样的事情。

完全代码......

key

3 个答案:

答案 0 :(得分:1)

如果该函数本身而不是在另一个函数内部,则var ctx可能是全局变量。如果需要局部变量,则应使用ctx代替,但不能从外部访问。如果需要访问this.ctx变量,则应将其声明为function parent() { var ctx = parentArea.context; function component(width, height color, x, y) { this.width = width; this.height = height; this.x = x; this.y = y; ctx = myGameArea.context; // References parent's ctx variable ctx.fillStyle = color; ctx.fillRect(this.x, this.y, this.width, this.height); } }

如果它在另一个函数内,那么它可能是一个捕获的变量:

sub new {

    my ($class, $name) = @_;

    my $self = {        
        _ids => [],
        _devices => {}       
    };

    bless ($self, $class);

    return $self;

}

答案 1 :(得分:0)

是的,似乎不要将它至少宣布为var是一种非常糟糕的做法。如果未使用var / let / const声明变量,则Javascript引擎将在全局命名空间中定义它们,并且可能具有未知的副作用。有点担心可以访问myGameArea全局(?)变量。为什么不注入构造函数?这样的事情会更清楚:

function component(width, height, color, x, y, myGameArea) {
  this.width = width;
  this.height = height;
  this.x = x;
  this.y = y;

  var ctx = myGameArea.context;
  ctx.fillStyle = color;
  ctx.fillRect(this.x, this.y, this.width, this.height);
}

答案 2 :(得分:0)

如果你引用函数体内的变量,JS将搜索函数的scope chain以找到变量。

如果变量未在函数本身内声明,那么它将在任何封闭函数的范围内查找,最后在全局范围内。

从您提供的片段中我们无法看到ctx是否在封闭函数中声明,或者是一个全局变量,尽管您说它不在构造函数之外使用,这意味着它未在任何地方声明。总的来说,我会说作者不小心使用了全局变量而不是局部变量。

顺便说一句:我建议使用诸如jshint之类的工具来获取错误,例如错误地使用全局变量。