028|JavaScript变量作用域

在前一节中,我们学习了通过var关键字创建变量。现在考虑一个问题,变量在脚本的任意地方都能被引用吗?

先来看一下例子:

function changeAge()
{
    var age = 18;
}
console.log(age);

上面的代码在函数体内定义了一个age变量,然后试图在函数体外引用这个变量。这个脚本能正常输出age变量的值吗,我们来看一下结果:

运行结果

可以看到,运行过程中发生了异常。异常的内容是:“age is not defined”,意思是age没有定义。为什么会这样?这背后的原因是什么?

JavaScript中每一个变量都有自己的作用域,在ES6标准之前,有两种作用域:

  • 全局作用域
    在脚本顶层即函数体外的区间,叫作全局作用域。在全局作用域内定义的变量,叫做全局变量。全局变量在代码任何地方都能被引用。
  • 局部作用域
    在函数内的区间,叫做局部作用域。在局部作用域内定义的变量,叫局部变量。局部变量只能在函数内被引用。

ECMAScript 6 (缩写为ES6)标准是JavaScript的语言标准,因其于2015年正式应用,因此也叫ES2015。

上述代码之所有会发生异常,是因为尝试在全局作用域中引用局部变量。

function changeAge()
{
    var age = 18;  // 局部变量
}

console.log(age); // 全局作用域

所以,全局作用域不能访问局部变量。那么局部作用域是否能访问全局变量呢?通一个例子来试一下:

var age = 18; // 全局变量
function changeAge()
{
    console.log(age);   // 局部作用域
}
changeAge()

上述代码中,尝试在局部作用域内输出全局变量。我们看一下运行结果 :

运行结果

可以看到,成功输出了全局变量。所以,局部作用域可以访问全局变量。

好,这一节讲完了。恭喜你!掌握了JavaScript中非常关键的作用域概念。后续还有很多技巧需要你慢慢学习。

什么是声明提升(hoisting)?
是函数默认参数?
什么是自定义类型?

请继续关注我的课程,我将在后续课程中为大家解答上述问题。

想学计算机技术吗?需要1对1专业级导师指导吗?想要团队陪你一起进步吗?欢迎加我为好友!

我的微信

推荐阅读更多精彩内容