函数表达式总结

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>函数表达式的应用</title>
    </head>
    <body>
        <script type="text/javascript">
            // 一、声明式(变量会提升,可以先使用再赋值)
            function functionName1(arg0,arg1,arg2){
                // 函数体
            }
            // 通过name属性访问函数名:只在Firefox、Safari、Chrome、Opera有效
            console.log(functionName1.name)// functionName1
            // 二、函数表达式(需先定义再使用)
            //2.1 创建函数再赋值给变量
            var functionName2 = function(arg0,arg1,arg2){
                // 函数体
            }

            console.log(functionName2.name)// "" (匿名函数返回空字符串)
            // 考虑到变量提升会在js程序中带来意想不到的结果,在条件语句中建议使用函数表达式
            var sayHi;
            var condition=true;
            if(condition){
                sayHi = function(){
                    alert("Hi!")
                }
            }else{
                sayHi = function(){
                    alert('No')
                }
            }
            // 2.2把函数作为其他函数的值返回(给对象排序)
            function createCompareFunction(propertyName){
                return function(obj1,obj2){
                    var val1 = obj1[propertyName];
                    var val2 = obj2[propertyName];
                  
 if(val1<val2){
                        return -1
                    }else if(val1>val2){
                        return 1
                    }else{
                        return 0;
                    }
                }
            }

 


        //三、函数表达式 优化递归
         //1、经典阶乘
         function factorial(num){
             if(num<=1){
                 return 1
             }else{
                 return num*factorial(num-1)
             }
         }
         //缺点如下
         var anotherFacorial=factorial;
         factorial = null;
         console.log(anotherFacorial(6));//出错!!!"Uncaught TypeError: object is not a function"

        // argments.callee指向正在执行的函数的指针(俗讲:代替函数名),可以解决此问题,实现对函数的递归调用
         function factorial(num){
             if(num<=1){
                 return 1
             }else{
                 return num*arguments.callee(num-1)
             }
         }
         var anotherFacorial=factorial;
         factorial = null;
         console.log(anotherFacorial(6)) // 720

         // 严格模式下不能访问 arguments.callee,这时可以使用到 函数表达式解决
         
         var factorial = (function f(num){
             if(num<=1){
                 return 1
             }else{
                 return num.f(num-1)
             }
         })


         //四、关于this对象
         var name = 'window';
         var obj = {
             name:'obj',
             getNameFunc:function(){
                 var that = this;
                 return function(){
                     return that.name;
                 }
             }

         }
         console.log(obj.getNameFunc()());// 'obj'
        // this会发生变化的情况
         var name2 = 'window2';
         var obj2 = {
             name2:'obj2',
             getName:function(){
                 return this.name2;
             }

         }
         console.log(obj2.getName());//obj2
         console.log((obj2.getName)());//obj2
         console.log((obj2.getName=obj2.getName)());//window2
      
        </script>
    </body>
</html>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值