变量作用域(JavaScript)

本文深入探讨JavaScript中的全局和局部作用域概念,解释变量提升现象,并介绍闭包如何维持对局部变量的引用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

JavaScript 有两个范围:全局和局部。  在函数定义之外声明的变量是全局变量,它的值可在整个程序中访问和修改。  在函数定义内声明的变量是局部变量。  每当执行函数时,都会创建和销毁该变量,且无法通过函数之外的任何代码访问该变量。  JavaScript 不支持块范围(通过一组大括号 {. . .} 定义新范围),但块范围变量的特殊情况除外。 

JavaScript 中的范围

虽然局部变量可具有与全局变量相同的名称,但它是完全独立的;更改一个变量的值不会影响另一个变量。   在声明局部变量的函数中,仅局部版本具有意义。 
// Global definition of aCentaur.
var aCentaur = "a horse with rider,";

// A local aCentaur variable is declared in this function.
function antiquities(){

   var aCentaur = "A centaur is probably a mounted Scythian warrior";
}

antiquities();
aCentaur += " as seen from a distance by a naive innocent.";

document.write(aCentaur);

// Output: "a horse with rider, as seen from a distance by a naive innocent."

在 JavaScript 中,变量就像它们在所在范围的开始被声明一样来计算。   有时,这会导致意外行为,如此处所示。 
var aNumber = 100;
tweak();

function tweak(){

    // This prints "undefined", because aNumber is also defined locally below.
    document.write(aNumber);

    if (false)
    {
        var aNumber = 123;  
    }
}

当 JavaScript 执行一个函数时,它首先会查找所有变量声明,例如 var someVariable;  它使用初始值 undefined 创建变量。  如果使用一个值声明变量(例如 var someVariable = "something";),则该变量的初始值仍为 undefined,并且仅当执行包含声明的行时才采用已声明的值。  

JavaScript 会在执行任何代码之前处理所有变量声明,无论是在条件块中声明还是在其他构造中声明。  JavaScript 一旦找到所有变量,就会执行函数中的代码。  如果在函数内部隐式声明变量(即,该变量出现在赋值表达式的左侧但尚未使用 var 进行声明),则它将创建为全局变量。  

在 JavaScript 中,内部(嵌套)函数将存储对局部变量的引用(即使在函数返回之后),这些局部变量存在于与函数本身相同的范围中。  这一组引用称为闭包。  在以下示例中,对内部函数的第二次调用所输出的消息与第一次调用相同(“Hello Bill”),因为外部函数的输入参数 name 是存储在内部函数闭包中的局部变量。 


function send(name) {
    // Local variable 'name' is stored in the closure
    // for the inner function.
    return function () {
        sendHi(name);
    }
}

function sendHi(msg) {
    console.log('Hello ' + msg);
}

//send('li');为什么不能直接调用函数send()呢?  解答:直接调用send()只是返回了sendHi()函数,再次运行才会输出结果。
var func = send('Bill');
func();
// Output:
// Hello Bill
sendHi('Pete');
// Output:
// Hello Pete
func();
// Output:
// Hello Bill

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值