js基础6(作用域、js解析顺序)

1、作用域

作用域用于就是变量访问性问题

  1. 全局作用域
    • 在script其实标签到结束标签都是在全局作用域里,在函数体之外,script标签内声明的变量就是全局变量
    • 全局作用域的变量可以在任何其他的作用域访问和修改
  2. 局部作用域
    • 一个函数体就是一个新的局部作用域
    • 函数内部定义的变量在局部作用域内,函数外部作用域不能访问内部作用域的变量
    • 每个函数有不同的作用域,在其他函数中不可以访问(一个函数访问另一个函数的变量,通过传递参数实现)
    • var声明的变量提升:在函数作用域或者全局作用域中通过var声明的变量,不管在哪里声明,都会被当成在当前作用域的顶部声明变量,这个称之为变量提升
  3. 块作用域

let,const不仅仅是声明变量的区别,他们还有支持块作用域的机制,自身会产生一个块作用域(注:这里说的不是大括号、if、switch、for产生的块)

  1. 作用域链
    • 函数作用域里面访问一个变量,先从自身开始找,如果没有,就依次往上一级作用域查找, 直到全局作用域,还是没有就报错
    • 当我们处于某一个作用域里,修改某个变量值时,先修改自身作用域的值,如果没有就依次修改上一个作用域的值
    • delete:删除未声明的变量,但是不能删除已经声明的变量
  let x = 1;
  function fun (){
    let y = 1;
  }

//块作用域
if (true){
  var name = "banta";
  let color = "red";
  const x = 1;
}
console.log(name);
console.log(color ); //会报错
console.log(x);

2、js解析顺序

  1. 编译(判断语法是否符合规范)
    先去查找第一个作用域里面所有var,function的声明,但不赋值(var,function声明同一个变量时,函数会覆盖var)
  2. 执行期
    运行js代码,执行期里面有新的作用域,就会被激活,重新开始编译-执行,依次类推
console.log(a);
fun();
var a = 10;
function fun (){
  console.log(a);
}
console.log(a); // undefined undefined 10
/*
  1、编译:
    var a;
    function fun (){};
  2、执行期
    30行 --- undefined 声明变量没有赋值
    31行 --- 函数自执行,产生新的作用域
      1、编译
      2、执行
        34行 --- undefined 找到全局作用域a,声明未赋值
        返回上一个作用域继续执行
      32行 --- a = 10 赋值
      36行 --- 10 
*/

你可能感兴趣的:(js基础6(作用域、js解析顺序))