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 的执行过程:
// 案例 1 
  var a = 25; 
  
  function abc() {
  
        alert(a); // undefined var a = 10; 
  }
  
  abc();


 // 案例 2
 
  console.log(a); // 25 

  function a() {

        console.log('aaaaa') // 不会执行, 没人调用 a()
  }
  
  var a = 1; 
  
  console.log(a); // 1 

三、变量提升

变量提升: 定义变量的时候,变量的声明会被提升到作用域的最上面,变量的赋值不会提升

函数提升: JavaScript 解析器首先会把当前作用域的函数声明提前到整个作用域的最前面

//1、----------------------------------- 
var num = 10;

fun(); 

function fun() {
    console.log(num);
    var num = 20; 
} 
//2、----------------------------------- 
var a = 18;
f1(); // 调用执行 22 行, 因为后者覆盖前者 f1 函数 
function f1() { 
    var b = 9;
    console.log(a); 
    console.log(b); 
    var a = '123'; 
} 
// 3、----------------------------------- 
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 关键字定义的变量,被称为变量声明

函数声明提升的特点是: 在函数声明的前面,可以调用这个函

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值