【JavaScript0:】:函数作用域、声明提前

148 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第14天,点击查看活动详情

1️⃣前言

大家好,我是翼同学。今天笔记的内容是:

  • 函数作用域、声明提前

2️⃣内容

函数作用域

说到声明提前,就不得不先说函数作用域。在JavaScript的中,函数作用域的特点与一些编程语言不同。比如C++语言,采用的是块级作用域,变量在声明他们的代码段之外是不可见的,每一个代码块中的局部变量都具有各自的作用域。而JavaScript使用的函数作用域,特点在于:变量在声明他们的函数体内(甚至这个函数体可以嵌套若干个函数)都是可见的,有定义的。

举个例子:

function func() {
    var a = 0;
    if (...){
        var b = 0;
        for(var c=0; ... ; ...){
                ...
        }
        ...
    }
    ...
}

在上述例子中的函数体内(无论在if语句中还是循环中),变量abc都是可见的。

简单来讲,这三个变量在函数体中都是有定义的。

声明提前

根据JavaScript的函数作用域特点,使其可以拥有声明提前的特性。即变量在声明之间就可以使用

这和类似 C++ 等编程语言完全不同。在一些编程语言中,变量必须声明后才能使用,否则是非法的。而在JavaScript的函数体中,完全可以在变量声明之前使用该变量。这步操作是在 JavaScript 引擎的“预编译”时进行的,在代码开始运行之前。

声明提前:JavaScript函数里声明的所有变量(注意不包括赋值)都被“提前”至函数体的顶部。

举个例子:

str = "333";
function func() {
    console.log(str);  //=> "undefined"
    var str = "666";   //=> "666"
    console.log(str);
}

在上述例子中,可以看到,前一个str并没有输出"333",而是输出"undefined"。这是因为函数体中声明了变量str,那么该变量在整个函数体中都是可见的,有定义的。由于在函数体中,局部变量的优先级会高于全局变量,因此该局部变量str就覆盖了全局变量str。直到程序执行到了赋值语句后,才会输出"666"

所以,上述声明提前的操作可以看成:

  • 将函数体内的变量声明“提前”到函数体顶部,同时变量初始化停留在原来的位置。

3️⃣写在最后

好了,今天的笔记就记到这里。