作用域

72 阅读2分钟

变量提升

1.声明变量var

当你使用var的时候会出现变量提升的情况,例如:

   console.log(a); //返回值undefined
    var a = 10;
    
   运行解析:
   var a ;
   console.log(a);
   a = 10;
   
复制代码

2.声明变量let

let不存在变量提升,例如:

console.log(a);//报错
    let a = 10;
复制代码

3.函数function

页面一加载的时候回先找有没有var和function
如果发现有var 就会把变量预定为undefried
如果发现有function 就会把function这个方法放在最前面

fn();
    var a = '123';
    function fn(){
        document.write(a);
    }
  打印结果:undefined
 运行解析:
 function fn(){     初始化变量提升 var a ; 
        document.write(a); //a = undefined
    }
  a = '123'

1.全局作用域

全局作用域 --- 在任何地方都能访问 函数外定义的变量拥有全局作用域 不使用var定义的变量拥有全局作用域 所有window对象上的属性拥有全局作用域 没有声明在任何函数内部的函数拥有全局作用域

  a = '123';
    function fn(){
        document.write(a);
    }
    fn(); //会在页面打印出123
    
  未定义的表里就是全局作用域;
复制代码

2. 局部作用域

局部作用域 --- 只能在函数内部访问 使用var在函数内部定义的变量,和使用function在函数内部声明的函数,拥有局部作用域

    function fn(){
      var  a = '123';
        document.write(a);
    }
    fn();  页面会打印123
    console.log(a)//报错   因为函数内部的是局部作用域 在外部没有定义a
 
复制代码

3.作用域链

可以通过代码访问的属性和一系列仅供JavaScript引擎访问的内部属性该内部属性包含了函数被创建的作用域中对象的集合,这个集合被称为函数的作用域链

let a = '你好';
function fn(){
    document.write(a);
}
fn();//调用这组函数 页面会打印出 你好;

let a = '你好';
function fn(){
    a = 'Hello';    //找到了a 返回a 就不会向上找了
    document.write(a); //向上寻找 
}
fn();//调用这组函数 页面会打印出 Hello 

let a = '你好';      //在这一层找到了a
function fn(){
                    //这一次也没有找到
    function fn(){
    document.write(a); //这个函数内部没有 向上层寻找
    }
}
fn();//调用这组函数 页面会打印出 你好 

代码分析:
作用域链 首先会在函数内部找变量a对应的值 
如果在内部没有找到对应的值  就会一层一层向外寻找