JavaScript变量作用域

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中,用浏览器加载它,得到的结果如图所示。

JavaScript变量作用域

使用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。这段程序的输出如图所示。

JavaScript变量作用域

酷客网相关文章:

赞(0)

评论 抢沙发

评论前必须登录!