作用域
ECMAScript中只存在一种作用域——公用作用域。ECMAScript中的所有对象的所有属性和方法都是公用的。
严格说来,ECMAScript并没有静态作用域。不过,它可以给构造函数提供属性和方法。构造函数只是函数。函数是对象,对象可以有属性和方法。例如:
function sayHi(){
alert('hi');
}
sayHi.alternate = function(){
alert('hola');
}
sayHi();//hi
sayHi.alternate();//bola
这里,方法alternate()实际上是函数sayHi的方法。可以像调用常规函数一样调用sayHi()输出"hi",也可以调用sayHi.alternate()输出"hola"。即使如此,alternate()也是sayHi()公用作用域中的方法,而不是静态方法。关键字this
关键字this总是指向调用该方法的对象,例如:
var o = new Object;
o.color = 'red';
o.showColor = function(){
//alert(this.color);//print: red
alert(o.color);//print: red
}
o.showColor();
上面this.color与o.color是等价的,即this就是o对象。那么为什么使用this呢?因为在实例化对象时,总是不能确定开发者会使用什么样的变量名。使用this,即可在任意多个地方重用同一个函数。请看:
function showColor(){
alert(this.color);
}
var o1 = new Object;
o1.color = 'red';
o1.showColor = showColor;var o2 = new Object;
o2.color = 'blue';
o2.showColor = showColor;o1.showColor();//print: red
o2.showColor();//print: blue
调用每个对象的showColor()方法,o1的输出"red",而o2的输出"blue"。这是因为调用o1.showColor()时,函数中的this关键字等于o1,调用.showColor()时,函数中的this关键字等于oCar2。
如果不用对象或this关键字引用变量,ECMAScript就会把它看作局部变量或全局变量。然后该函数将查找名为color的局部或全局变量,但是不会找到的。