作用域与变量提升

作者: HM4041812 | 来源:发表于2017-11-18 22:07 被阅读4次

    作用域与变量提升


    作用域

    JS中变量的作用域有全局作用域和局部作用域两种,作用域简单来讲就是变量与函数的可访问范围。

    • 全局作用域:
      1.最外层函数和最外层函数外面定义的变量。
      2.未声明直接赋值的变量,自动声明为全局变量。
      3.window对象的内置对象,如window.name,window.location。
    • 局部作用域:
      一般会出现在函数内部,只有固定的代码段才可以访问。

    局部作用域变量优先于全局变量,函数只是一个作用域的基本单位。

    例1:

    var name = "one";
    function test() {
        name = "two"
    }
    test();
    console.log(name)    //输出为 two
    

    解析
      函数内部省略var,会影响全局变量,name被重置为全局变量。js中,函数是一个作用域的基本单位,函数内声明的所有变量在函数体内始终是可见的。

    例2:

       function test() {
           var name = "one" ;
               return function () {
                  console.log(name)
               }
       }
    test()();
    

    test()之后将调用外层函数test返回内层函数function,再继续(),相应调用执行了内层函数function(),输出name。

    变量提升

    声明提前是在js预编译是就进行了,变量提升知识提升变量的声明,并不会吧值也提上来。

    例1:

    var name = "one" ;
    function () {
       console.log(name)   //one
       name = "two" ;
       console,log (name)  //two
    }
    test();
    
    var name = "one" ;
    function () {
       console.log(name) ;    //undefine
       var name = "two" ;
       console.log(name)      //two
    }
    test()
    

    解析:
    局部优先于全局,预编译(变量提升),所以函数内的name为局部变量,所以第一个位undefine。

    内部不影响外部

    function test(name) {
       console.log(name)    //name
       name = "two"
       console.log(name)    //two
    }
    var name = "one"
    test(name)
    console.log(name)      //one
    

    解析:
      传进test的,实际上是一个副本,函数返回后这个副本就被清除了,并非实际的name。

    相关文章

      网友评论

        本文标题:作用域与变量提升

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