JavaScript变量作用域,在函数中声明变量时,有一条最重要的原则需要了解:函数内部声明的变量只存在于函数内部。
这种限制性原则称为变量的作用域。来看下面这个范例:
//定义函数addTax()
function addTax(subtotal, taxRate) {
var total = subtotal * (1 + (taxRate/100));
return total;
}
//调用这个函数
var invoiceValue = addTax(50,10);
alert(invoiceValue); //正常工作
alert(total); //不工作
运行上述代码,首先会看到alert()对话框显示了变量invoiceValue的值(应该是55,但可能会看到类似于55.00000001这样的数值,因为我们没有让JavaScript对结果四舍五入)。
之后,我们并不会看到alert()对话框显示变量total的值。相反,JavaScript会生成一个错误,而我们是否能够看到这个错误提示则取决于浏览器的设置,但无论如何,JavaScript都不能显示带有变量total的值的alert()对话框。
这是因为变量total是在addTax()函数内部声明的,也就是说,变量total在函数之外就是不存在的(JavaScript术语就是“未定义的”)。范例中利用关键字return返回的只是变量total保存的值,然后这个值被保存到了另一个变量invoiceValue中。
我们把函数内部定义的变量称为“局部”变量,也就是属于函数这个“局部”的。函数之外声明的变量称为“全局”变量。全局变量和局部变量可以使用相同的名称,但仍然是不同的变量!
变量能够使用的范围称为变量的“作用域”,因此可以称一个变量具有“局部作用域”或“全局作用域”。
变量作用域示范
为了说明变量的作用域,我们来看下面这段代码:
var a = 10;
var b = 10;
function showVars() {
var a = 20; //声明一个新的局部变量 ′a′
b = 20; //改变全局变量′b′的值
return"Local variable ′a′ = " + a + "\nGlobal variable′b′ = " + b;
}
var message = showVars();
alert(message + "\nGlobal variable′a′ = " + a);
函数showVars()操作了两个变量:a和b。变量a是在函数内部定义的,因此它是一个局部变量,仅存在于函数内部,与脚本一开始定义的全局变量(名称也是a)是完全不同的。
变量b不是在函数内部而是在外部定义的,因此它是一个全局变量。
如下程序是把上述代码放置于HTML页面的结果,全局和局部作用域
<!DOCTYPE html>
<html>
<head>
<title>Variable Scope</title>
</head>
<body>
<script>
var a = 10;
var b = 10;
function showVars() {
var a = 20; // 声明一个新的局域变量′a′
b = 20; // 修改全局变量′b′的值
return "Local variable ′a′ = " + a + "\nGlobal variable ′b′ = " + b;
}
var message = showVars();
alert(message + "\nGlobal variable ′a′ = " + a);
</script>
</body>
</html>
当页面加载之后,showVars()函数返回一个消息字符串,其中包含了在函数内部存在的两个变量(a和b)被更改之后的信息。这里的a具有局部作用域,b具有全局作用域。
之后,全局变量a的当前值也附加到这个消息,然后完整地显示给用户。
把上述代码保存到scope.html中,用浏览器加载它,得到的结果如图所示。
使用this关键字
我们像下面这样定义一个内联的事件处理程序:
<img src="tick.gif" alt="tick" onmouseover="this.src=′tick2.gif′;" />
当以这种方式使用时,this引用HTML元素自身—在上面的例子中,就是<img>
元素。
在函数中使用this时,关键字this引用的“拥有”该函数的任何对象,即该函数的父作用域的内容。
在程序中 showVars()
函数在“最顶级”创建。换句话说,它属于全局对象,也就是拥有全局作用域中的任何变量的对象。在Web浏览器中,全局对象通常就是浏览器的window对象。
因此,如下所示,如果要求该函数返回this.a
的值,将会发生什么情况呢?
function showVars() {
var a = 20; // 声明一个新的局域变量′a′
b = 20; // 修改全局变量′b′的值
return "this.a = " + this.a + "\nLocal variable ′a′ = " + a + "\nGlobal
variable ′b′ = " + b;
}
var message = showVars();
alert(message + "\nGlobal variable ′a′ = " + a);
由于这里的this引用了全局对象,this.a
将引用全局作用域中的变量a。这段程序的输出如图所示。
酷客网相关文章:
评论前必须登录!
注册