JavaScript作用域以及预解析详解

作用域:变量可以起作用的范围

全局变量:声明的变量是使用var声明的,那么这个变量就是全局变量,全局变量可以在页面的任何位置使用
除了函数以外,其他任何位置定义的变量都是全局变量
局部变量:在函数内部用var定义的变量,是局部变量,外面不能使用
局部变量,如果页面不关闭,那么它的空间就不会释放
      
不使用var声明的变量是全局变量,不推荐使用。
变量退出作用域之后会销毁,全局变量关闭网页或浏览器才会销毁

块级作用域:
任何一对花括号({和})中的语句集都属于一个块,在这之中定义的所有变量在代码块外都是不可见的,我们称之为块级作用域。 在es5之前没有块级作用域的的概念,只有函数作用域,

全局作用域:全局变量的使用范围
局部作用域:局部变量的使用范围

词法作用域
变量的作用域是在定义时决定而不是执行时决定,也就是说词法作用域取决于源码,通过静态分析就能确定,因此词法作用域也叫做静态作用域。
在 js 中词法作用域规则:
函数允许访问函数外的数据.
整个代码结构中只有函数可以限定作用域.
作用域规则首先使用提升规则分析
如果当前作用规则中有名字了, 就不考虑外面的名字

隐式全局变量:声明变量没有用var,就叫隐式全局变量
全局变量不能被删除,隐式全局变量可以被删除(定义变量使用var是不会被删除的,没有var是可以被删除的)
 var num1=10;
       num2=20;
       delete num1;//把num1删除了
       delete num2;//把num2删除了
       console.log(typeof num1);//number
       console.log(num1+10);//20
       console.log(typeof num2);//undefined

作用域链

只有函数可以制造作用域结构, 那么只要是代码,就至少有一个作用域, 即全局作用域。凡是代码中有函数,那么这个函数就构成另一个作用域。如果函数中还有函数,那么在这个作用域中就又可以诞生一个作用域。
将这样的所有的作用域列出来,可以有一个结构: 函数内指向函数外的链式结构。就称作作用域链。

在这里插入图片描述

预解析

JavaScript代码的执行是由浏览器中的JavaScript解析器来执行的。JavaScript解析器执行JavaScript代码的时候,分为两个过程:预解析过程和代码执行过程
预解析过程:
把变量的声明提升到当前作用域的最前面,只会提升声明,不会提升赋值。
把函数的声明提升到当前作用域的最前面,只会提升声明,不会提升调用。
先提升var,在提升function

   如果变量和函数同名的话,函数优先
    console.log(a);//函数a的代码
    function a() {
        console.log('aaaaa');
    }
    var a = 1;
    console.log(a)//1
预解析会分段(多对的script标签中函数重名,预解析的时候不会冲突)
<script>
    function f1() {
        console.log("哈哈");
    }
</script>
<script>
    f1();
    function f1() {
        console.log("嘎嘎");
    }
</script>

  f1();//-----报错
   var f1=function () {
      console.log(a);
      var a=10;
    };

f1();
console.log(c);//9
console.log(b);//9
console.log(a);//报错
function f1() {
  var a = b = c = 9;
  console.log(a);//9
  console.log(b);//9
  console.log(c);//9
}
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值