我在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
答案 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之类的工具来获取错误,例如错误地使用全局变量。