javas基础03——函数的作用域及变量提升

Posted wuziqiang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了javas基础03——函数的作用域及变量提升相关的知识,希望对你有一定的参考价值。

1.作用域

作用域,变量在函数内部作用的范围/区域。有函数的地方就有作用域。
 

2.局部作用域和全局作用域

function fn(){
        var a = 1;
    }
    console.log(a);    //报错:a is not defined
    用var声明的变量,实际上是有作用域的
    在函数内部定义的变量,该变量的作用域是整个函数体,在函数体外不可引用该变量,这是局部作用域

    变量的生命周期:
    1.永远存在----全局
        程序没关,一直占用内存,少用全局
    
    2.朝生暮死----局部
        函数的大括号开头到函数的大括号结尾

    var a = 1;
    function fn(){
        console.log(a);    //1
    }
    console.log(a);    //1
    不在任何函数内定义的变量就具有全局作用域。全局变量在任何地方都能调用。

    作用域的处理方式:利用匿名函数生成一个局部作用,把变量的声明和使用这个变量的小函数都放在匿名函数中
// 作用域:
        // 生效的区域
        // 变量生效的区域
    
    // 区域:
        // 全局:整个代码文件,不属于任何一个函数,就是全局
        // 局部:每个函数都是一个局部

        // 能不能跨作用域访问:
            // 同级局部不能跨
            // 父不能拿子,子能拿父
            // 多个父子级作用域内都有,找最近的作用域
// 全局作用域下的变量,叫全局变量
    var a = 10;
    // 局部作用域下的变量,叫局部变量
    function fn(){
        var a = 20;
        console.log(a)
    }
    function fn1(){
        var a = 30;
        console.log(a)
    }
    function fn2(a){
        console.log(a)
    }
    fn();
    fn1();
    fn2("hello");
    // console.log(a);

    // 函数中的形参也是变量,形参也是当前函数的局部变量

3.声明提升

 

变量声明提升:
    console.log(a)        //undefined已经声明但是未赋值
    var  a = 2;
    console.log(a)        //2

    consoleo.log(b)       //not a defined未声明
    
    function fn(){
        console.log(a)    //undefined
        var a = 1;
    }
    fn();
    在函数fn()中,在没有定义变量之前打印a,得到undefined,而并不是not defined
    说明此时变量已经被声明,只是还没有被赋值。

    上面的fn()函数可以理解成
    function fn(){
        var a;
        console.log(a);
        a = 1;
    }
    fn();

    我们称这种现象为变量的声明提升,所有使用var声明的变量会在当前作用域最开始的部分被声明。   

 

 

函数的声明提升:整体提升
函数的声明提升:整体提升
    fn();        //2
    function fn(){
        console.log(2);
    }
    fn();        //2

------------------------------------
注意:
    console.log(fn);     //undefined
    fn();                //not a function
    var fn = function(){
        console.log(1);
    }

 

 function fn(){
        console.log(a);     //f2
        var a = "hello";
        console.log(a);     //"hello"
        function a(){1}
        console.log(a);     //"hello"
        a = "world";
        console.log(a);     //"world"
        function a(){2}
        console.log(a);     //"world"
    }
    // 以上代码等价于↓↓↓
    function fn(){
        var a;
        function a(){1}
        function a(){2}
        console.log(a);     //f2
        a = "hello";
        console.log(a);     //"hello"
        console.log(a);     //"hello"
        a = "world";
        console.log(a);     //"world"
        console.log(a);     //"world"
    }
    fn();

 

 
 

以上是关于javas基础03——函数的作用域及变量提升的主要内容,如果未能解决你的问题,请参考以下文章

关于JavaScript的词法作用域及变量提升的个人理解

javascript函数作用域及this指向详解

javascript函数作用域及this指向详解

JavaScript作用域及作用域链详解声明提升

理解javascript作用域及hosting机制

函数作用域及作用域链