携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第14天,点击查看活动详情
1️⃣前言
大家好,我是翼同学。今天笔记的内容是:
- 函数作用域、声明提前
2️⃣内容
函数作用域
说到声明提前,就不得不先说函数作用域。在JavaScript的中,函数作用域的特点与一些编程语言不同。比如C++语言,采用的是块级作用域,变量在声明他们的代码段之外是不可见的,每一个代码块中的局部变量都具有各自的作用域。而JavaScript使用的函数作用域,特点在于:变量在声明他们的函数体内(甚至这个函数体可以嵌套若干个函数)都是可见的,有定义的。
举个例子:
function func() {
var a = 0;
if (...){
var b = 0;
for(var c=0; ... ; ...){
...
}
...
}
...
}
在上述例子中的函数体内(无论在if语句中还是循环中),变量a、b、c都是可见的。
简单来讲,这三个变量在函数体中都是有定义的。
声明提前
根据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️⃣写在最后
好了,今天的笔记就记到这里。