美文网首页
javascript之作用域

javascript之作用域

作者: 5df463a52098 | 来源:发表于2019-02-15 10:48 被阅读6次

    一、什么是作用域

    变量访问的有效范围
    1、作用域外,无法引用作用域内的变量
    2、离开作用域后,作用域的变量的内存空间会被清除,比如执行完函数或者关闭浏览器。

    二、全局作用域

    1、在浏览器环境中声明变量,该变量会默认成为全局 windows 对象的属性。
    2、在函数中,如果不加 var声明一个变量,那么这个变量会默认被声明为全局变量,如果是严格模式则会报错。

    // 1
    foo = 'foo'
       console.log(window.foo); // foo
    //2
       function fc() {
           name = 'aaa'
       }
       fc()
       console.log(window.name); // aaa
    //3
       var a = 'ccc'
       console.log(window.a); // ccc
    

    全局变量可以在任何地方访问到,但是容易造成命名污染。

    三、函数作用域

    JS 是函数作用域,在函数中定义一个局部变量,那么该变量只可以在该函数作用域中被访问。

    function doSomething() {
        var thing = "吃早餐";
    }
    console.log(thing);  // 报错
    

    在外层函数中,嵌套一个内层函数,那么这个内层函数可以向上访问到外部作用域的变量。内层函数可以访问到外层函数的变量,如果外层函数把内层函数返回,那外层函数的变量得以保存。

    function outter() {
            var thing = "吃晚餐";
    
            function inner() {
                console.log(thing);
            }
            return inner;
        }
    
        var foo = outter();
        foo();  // 吃晚餐
    

    四、块级作用域

    JS 在 ES6 之前只有函数作用域,没有块级作用域的概念。
    ES 6 中通过 let 和 const关键字 引用了块级作用域的概念,所谓块级作用域,就是以 {}包裹的区域。

    var a = [];
    for (let i = 0; i < 10; i++) {
      a[i] = function () {
        console.log(i);
      };
    }
    a[6]();   // 6;
    

    let 和 const 会声明一个块级作用域的变量及常量,不易发生变量命名污染的问题,能规避冲突。

    五、词法作用域(静态作用域)

    无论函数在哪里调用,词法作用域都只由函数被声明时所处的位置决定。

    //1
     var a = 123;
        function func1() {
            console.log(a);
        }
        function func2() {
            var a = 456;
            func1();
        }
        func2(); // 123
    // 2
        var b = 123;
        function funcb() {
            var b = 456;
            function funca() {
                console.log(b);
            }
            funca();
        }
        funcb(); // 456
    

    六、作用域链

    函数作用域的嵌套就组成了所谓的函数作用域链。当在自身作用域内找不到该变量的时候,会沿着作用域链逐步向上查找,若在全局作用域内部仍找不到该变量,则会抛出异常。

    相关文章

      网友评论

          本文标题:javascript之作用域

          本文链接:https://www.haomeiwen.com/subject/vmqpeqtx.html