一、深入之作用域(Scope)

作者: 七_五 | 来源:发表于2017-06-06 23:10 被阅读0次

    0x00、引言

    在编程语言中,Scope控制着变量与参数的可见性及生命周期。对于写代码的我们而言也是一项重要的服务,它减少了名称冲突并提供了自动内存管理。
    JavaScript中的作用域分为全局作用域和函数作用域两种

    0x01、函数作用域

    函数作用域: 即定义在函数中的参数和变量在函数外部是不可见的。而在函数内部位置定义的变量,在该函数内部任何地方都可见,千万注意不要和块级作用域弄混淆了!不要和块级作用域弄混淆了!不要和块级作用域弄混淆了!

    demo

      var foo = function {
        var a =3 , b=5;
        var bar = function(){
            var b = 7, c = 11   //此时a =3 ,b =7 ,c =11
            a += b + c;         //此时 a= 21,b = 7,c = 11
        };
        //bar()函数调用前:a =3,b=5,c为undefined
        bar();
        //bar()函数调用后:a = 21,b =5(若块级作用域,此刻a应该为3)
      }
    

    0x02、ES6新增块级作用域

    我们知道在大多数类C语言中都拥有块级作用域。通常在一个 代码块{....}中,定义的所有变量在代码块外部是不可见的;定义在代码块中的变量在代码块执行结束后会被释放掉,这是一个很优雅的特性。

    demo

    {
      let a = 7
      var b = 5
    }
    console.log(a)     // a is not defined
    console.log(b)    // 5
    

    出现上面的结果,是因为var定义的变量不受块级作用域的约束(这里可以看作全局变量),因此打印出b=5;而let是受的块级作用域约束的,在{...}中所有变量在代码块的外部不可见

    下面我们来聊一下ES6中let和const的区别:其实简单的说,就是let主要是用来定义变量的,而const用于定于常量(定义时必须立即赋值,并不可被覆盖),当然它们同样在遵循块级作用域。

    0x03、总结

    其实我们需要重点注意的是函数作用域与块级作用域的区别,并且对函数作用域需要关注的是:内部函数可以自由访问定义它们的外部函数的参数和变量,这也为我们的闭包奠定了基础

    相关文章

      网友评论

        本文标题:一、深入之作用域(Scope)

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