持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第3天,点击查看活动详情
JavaScript 中的作用域、预解析与变量声明提升?
作用域
含义:就是变量的有效范围。 在一定的空间里可以对数据进行读写操作,这个空间就是数据的作用域.
1、全局作用域:
最外层函数定义的变量拥有全局作用域,即对任何内部函数来说,都是 可以访问的;
2、局部作用域:
局部作用域一般只在固定的代码片段内可访问到,而对于函数外部是无 法访问的,最常见的例如函数内部。在 ES6 之前,只有函数可以划分变量的作用域,所以 在函数的外面无法访问函数内的变量
3、块级作用域:
凡是代码块就可以划分变量的作用域,这种作用域的规则就叫块级作用域 块级作用域 函数作用域 词法作用域之间的区别:
3.1)块级作用域和函数作用域描述的是,什么东西可以划分变量的作用域
3.2)词法作用域描述的是,变量的查找规则
之间的关系:
1、 块级作用域包含函数作用域
2、 词法作用域与块级作用域、函数作用域之间没有任何交集,他们从两个角度描 述了作用域的规则
ES6 之前 JavaScript 采用的是函数作用域+词法作用域,ES6 js 采用的是块级作用域+词 法作用域
预解析
JavaScript 代码的执行是由浏览器中的 JavaScript 解析器来执行的。JavaScript 解析器 执行 JavaScript 代码的时候,分为两个过程:预解析过程和代码执行过程
预解析过程:
1.把变量的声明提升到当前作用域的最前面,只会提升声明,不会提升赋值
2.把函数的声明提升到当前作用域的最前面,只会提升声明,不会提升调用
3.先提升 function,在提升 var
JavaScript 的执行过程:
var a = 25;
function abc() {
alert(a); // undefined
var a = 10;
}
abc();
console.log(a); // 25
function a() {
console.log('aaaaa'); // 不会执行, 没人调用 a()
}
var a = 1;
console.log(a); // 1
变量提升
变量提升:
定义变量的时候,变量的声明会被提升到作用域的最上面,变量的赋值不会提 升
函数提升:
JavaScript 解析器首先会把当前作用域的函数声明提前到整个作用域的最前面
var num = 10;
fun();
function fun() {
console.log(num);
var num = 20;
var a = 18;
f1(); // 调用执行 22 行, 因为后者覆盖前者 f1 函数
function f1() {
var b = 9;
console.log(a);
console.log(b);
var a = '123';
f1(); // 再次调用下面的 f1 执行
console.log(c); // 9
console.log(b); // 9
console.log(a); // 18
function f1() {
var a = b = c = 9; // 这里相当于 var a = 9; b = 9; c = 9, 所以后 2 个隐
藏转换为全局变量了
console.log(a); // 9
console.log(b); // 9
console.log(c); // 9
}
变量声明提升:
使用 var 关键字定义的变量,被称为变量声明; 函数声明提升的特点是,在函数声明的前面,可以调用这个函数