javascript函数声明与函数表达式的区别:函数声明提升

1、定义函数的方式有两种,函数声明和函数表达式,对应语法:

函数声明:function funName(){}
函数表达式:var funName = function(){}

2、上述两种方式除了定义的语法不同之外,最主要的区别是函数声明具有【函数声明提升】的特点,将函数声明提升到作用域顶端,意思是在执行代码之前会先读取函数声明,也就是说可以把函数声明放在函数调用的后面。下面通过例子说明:

1:
            test();//弹出hello,因为【函数声明提升】的特点,函数调用之前,已经读取了该函数完成了声明

            function test(){
                alert("hello");
            }


    例2:
            test();//报错:Uncaught ReferenceError: test is not defined

            //因为【函数表达式】不具备提升的特点,在函数调用时,作用域中还未读取该函数的定义
            //作用域读取函数表达式是按照代码顺序读取
            var test = function(){
                alert("hello");
            }

            test();//弹出hello3if(condition){
                function test(){
                    alert("hello");
                }
            }else{
                function test(){
                    alert("world");
                }
            }

            //弹出world,因为函数声明在代码执行前就已经完成了,作用域已经完成了对该函数的读取,与条件无关
            //同名函数声明,后面的会覆盖前面的
            test();

            if(condition){
                var test2 = function(){
                    alert("hello");
                }
            }else{
                var test2 = function(){
                    alert("world");
                }
            }

            //弹出内容与条件相关,作用域读取函数表达式是按照代码执行顺序读取的
            test2();


    例4//函数表达式
            var  test = function(){
                alert("hello");
            }
            //第一次调用
            test();

            //变量声明
            var s = "world";

            //函数声明
            function test(){
                alert(s);
            }
            //第二次调用
            test();

        解释:两次调用都将弹出hello,在代码执行前方式二已经被作用域读取,然后执行方式一代码,方式一的test覆盖方式二的test,然后执行两次调用弹出hello

3、还有一种函数的方式,自执行函数,它也不具有作用域提升的特点,作用域读取函数也是按照代码执行顺序来读取的,语法及例子如下:

            //自执行函数,声明完成即执行,
            (function(){
                alert(s);//弹出undefined,作用域按照执行顺序读取函数,此时还未读取变量s
            })();

            var s = "hello";
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值