函数作用域及函数表达式

Posted lznzxy

tags:

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

一、函数作用域

  在javascript中,作用域分为全局作用域及函数作用域(局部作用域);

  例如:

var num = 100;
            function fun(){
                console.log(num)
                var num1 = 200;
                function fun2(){
                    console.log(num1);
                }
            }
            fun()

  执行后都会正常输出num及num1的值,
  用var定义的变量,在函数外定义的为全局变量,在函数内定义的为局部变量,作用域有所不同,但全局变量是相对的,如上对num1的定义对函数内的fun2函数同样产生了全局变量的效果。

function fun (){
                var num = 100;
            }
            fun();
            console.log(num);

  但如果是这样,在函数里面定义在函数外面输出,结果就是undefined。

function fun (){
                num = 100;
            }
            fun();
            console.log(num);

  另外,如果变量不通过var来定义而是直接定义,那么就是一个全局变量,如上就会正常输出。

 

二、函数声明和函数表达式

  1、函数声明和函数表达式分别是什么

    我们常见的函数写法如 function fun(){ } 这样的称之为函数声明

                                         fun = function (){ } 这样的称之为函数表达式

  2、函数声明和函数表达式的区别

    对于函数表达式而言,函数名可有可无,而对于声明函数,需通过函数名来调用;

    函数表达式可以直接被执行符号执行:

var fun2 = function(){    //函数表达式
                console.log("world");
            }()

    那么对于函数声明就不能这么执行了,但是,在函数声明前面加上+-!可以让函数声明变成函数表达式:

+function fun(){    //函数声明
                console.log("hello");
            }()
//            在函数的前面可以加上+-!可以让函数声明变成函数表达式

  3、立即执行函数

    什么是立即执行函数:函数声明了以后直接自己执行,用函数的返回值,适合做初始化的工作。

    如:

+function(){        //立即执行函数
                console.log("hello")
            }()

    这就是一个立即执行函数;

    

    当立即执行函数中参数并没有给定的时候,输出参数为undefined

function fun(a,b){
                console.log(a);
                console.log(b)
            }
            fun(3)

    如上,输出的a为3,输出的b为undefined。

    

    另外,例如:

var abc = "helloworld"
        
            (function(){    //写功能型的时候,在立即执行函数前面加上分号
                console.log(456)
            })()

    这样在运行的时候会报错,

    在JavaScript中,一般情况未添加的“;”会自动补全,但是在写功能性的时候注意,在立即执行函数前面加“;”。


以上是关于函数作用域及函数表达式的主要内容,如果未能解决你的问题,请参考以下文章

JS 作用域及作用域链

函数作用域及函数表达式

函数作用域及作用域链

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

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

JS 函数作用域及变量提升那些事!