作用域简说

220 阅读2分钟

作用域

  • 作用域就是代码能起作用(能影响)的区域

    • 全局作用域 和 私有作用域
  • 作用域就是一块栈内存

  • 堆内存是用来存储引用数据类型的

  • 栈内存是用来存储值类型的,还有就是用来提供代码运行环境

  • 全局作用域

    • 页面一打开就会形成一个全局作用域,一个页面只有一个全局作用域
  • 私有作用域

    • 在函数执行的时候会形成一个私有的作用域
  • 块级作用域

    • 指的是 判断句 循环句 的大括号包起来的部分
    • 是es6新增的,只有let 和 const 声明的变量能识别块级作用域,对于var来说,不存在块级作用域这一说
  • 全局作用域中声明的变量,我们称为全局变量

  • 私有作用域中声明的变量,我们称为私有变量

    • 形参也是私有变量
  • 上级作用域

    • 函数执行时形成的那个私有作用域,一般都会存在一个上级作用域,私有作用域的上级作用域是谁,跟这个函数在哪里执行没有关系,只跟函数在那个作用域定义的有关
  • 作用域链

    • 私有作用域中的变量,有可能不是该私有作用域的私有变量,这时,该变量对应的值就需要去上级作用域查找,若仍不是上级作用域的私有变量,则接着向上级查找,知道找到 window(全局)位置,若仍没有,则报错。
  • 函数执行时,现有形参赋值,再有变量提升

  • var a = b = 20; ==> var a = 10; b = 20; 这个b没有变量提升

  • var a = 10,b=20; ==> var a = 10; var b = 10;

练习

function f2(){
    let b = 100;
    function f(){
    console.log(b);
    var a = 100;
    }
 f()
}
f2(

var a = 1;
    function fn() {
        console.log(a); 
        var a = 5;
        console.log(a);
        a++;
        var a;
        fn3();
        fn2();
        console.log(a); 
        function fn2() {
            console.log(a); 
            a = 20;
        }
    }
    function fn3() {
        console.log(a); 
        a = 200;
    };
    fn();
    console.log(a);

    console.log(num,str);  
    var num = 18;
    var str = 'lily'
    function fn2(){
        console.log(str,num);  
        num = 19;
        str = 'candy';
        var num = 14;
        console.log(str,num); 
    }
    fn2()
    console.log(str,num);

  • 块级作用域:指的是 判断句 循环句 的大括号抱起来的部分 es6新增 只有let 和 const 声明的变量能识别块级作用域,对于var来说,不存在块级作用域这一说
var foo =1
    function bar(){

        if(foo){
            var foo =10
        }
        console.log(foo); //undefined

    }
    bar()