js中的作用域,预解析与变量提升

作用域:

作用域就是变量的有效范围,离开了这个范围变量就无法被访问。

  1. 全局作用域: 全局作用域中声明的变量,任何其他作用域都可以被访问。
    • 注意:
    1. 为window对象动态添加的属性默认也是全局的,不推荐
    2. 函数中未使用任何关键字声明的变量为全局变量,不推荐
    3. 尽可能的少的使用全局变量,防止全局变量被污染。
    • 全局作用域有哪些? < script /> 标签内部 .js文件
    • 全局作用域声明的变量其他作用域能使用
  2. 局部作用域:
    • 函数作用域:在函数内部声明的变量只能再函数内部被访问,外部无法直接访问

      总结:

      1. 函数内部声明的变量,再函数外部无法直接被访问
      2. 函数的参数也是函数内部的局部变量
      3. 不同的函数内部声明的变量无法直接互相访问
      4. 函数执行完毕之后,函数内部的变量实际被清空了。
    • 块作用域:再js中使用 {} 包裹的代码成为代码块,代码块内部声明的变量外部将【有可能无法被访问】。
      在这里插入图片描述

      总结:

      1. let 声明的变量会产生块作用域,var不会产生块作用域
      2. const声明的常量也会产生块作用域
      3. 不同代码块之间的变量无法互相访问
      4. 推荐使用let和const
    • 局部作用域分为函数作用域和块作用域,局部声明的变量外部不可以使用

预解析

js代码的执行是由浏览器中的javascript解析器来执行,js解析器执行js代码的时候,分为两个过程,预解析过程和代码执行过程。
预解析过程:

  1. 把变量的声明提升到当前作用域的最前面,只会提升声明,不会提升赋值。
  2. 把韩式的声明提升到当前作用域的最前面,只会提升生明,不提升调用。
  3. 先提升var,再提升function。

代码执行过程:

// 案例 1
var a = 25;
function abc() {
  alert(a);
  var a = 10;
}
abc();
​
​
// 案例 2
console.log(a);
function a() {
  console.log('aaaaa');
}
var a = 1;
console.log(a);

只有var声明的变量才有变量提升,let和const没有

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值