Javascript基础(6)-作用域与预解析

141 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第27天,点击查看活动详情

作用域

Javascript中作用域是指变量或函数可以起作用的范围。ECMAScript规范中定义了两种作用域, 分别是全局作用域局部作用域

  1. 全局作用域:script标签或js文件所包含的范围(区域)叫全局作用域。在全局作用域中定义的变量称为全局变量,全局变量在任何位置都可以访问。
  2. 局部作用域:一个函数的内部所包含的范围(区域)叫局部作用域。在局部作用域中定义的变量称为局部变量,局部变量只能在当前的局部作用域中访问,函数参数也是局部变量。 注意:局部变量退出局部作用域之后会销毁,全局变量关闭网页或浏览器才会销毁;不通过声明的变量是全局变量。
var num1 = 3;
function fn() {
    var num2 = 5; //num是局部变量
    console.log(num1); // 3
}
fn();
console.log(num2);//Uncaught ReferenceError: num is not defined

预解析

JavaScript代码的执行是由浏览器中的JavaScript解析器来执行的。JavaScript解析器执行JavaScript代码的时候,分为两个阶段,预解析阶段(预处理、预编译)与执行阶段。

JavaScript的预解析是JavaScript代码解析机制与运行机制中的一部分,是指在JS代码解析执行之前做的一些解析工作,比如函数声明提前,变量声明提前等等。

步骤

  1. 提升变量声明:把变量的声明提升到当前作用域的最前面,只会提升声明,不会提升赋值。
//预解析之前的代码
console.log(a,b,'->开始');
var a = 1;
var b = 2;
console.log(a,b,'->结束');
//预解析之后的代码
var a ;
var b ;
console.log(a,b,'->开始');
a = 1;
b = 2;
console.log(a,b,'->结束');
  1. 提升函数声明:把函数的声明提升到当前作用域的最前面,只会提升声明,不会提升调用。
//预解析之前的代码
console.log('开始了');
fn1();
function fn1() {
    console.log('fn1');
}
function fn2() {
    console.log('fn2');
}
console.log('结束了');
//预解析之后的代码
function fn1() {
    console.log('fn1');
}
function fn2() {
    console.log('fn2');
}
fn1();
console.log('开始了');
console.log('结束了');