zoukankan      html  css  js  c++  java
  • JavaScript-函数

    函数是什么?这里就不做过多的解释了。我们直接进入主题:

    一、函数的定义

    1、函数声明(需要关注的点是:函数声明的提升)  

    function funcName(arg1,arg2,arg3){
        //需要执行的内容
    }

    2、函数表达式(需要关注的点是:具名函数表达式的函数名只能在创建函数内部使用

    var myFunc=function(){
        //需要执行的代码
    }
    var myFunc=function my(){
        //需要执行的代码
    }

    当然还有其他的创建方法,但是不是很常用也不推荐,所以就不给大家示范了,如Function,eval(),自执行函数等

    二、函数声明提升

    来看两端代码:

    sayLove("林丽君","张俊祺");
    function sayLove(avg1,avg2){
        console.log(avg1,"love",avg2);
    }

    这个时候我们的代码不会报错,可是看一下函数表达式:

    sayLove("林丽君","张俊祺");
    var sayLove= function(avg1,avg2){
        console.log(avg1,"love",avg2);
    }

    这时候我们的程序会找不到sayLove这个函数,原因就是函数声明提升,也就是说我们可以把函数声明放在调用它的语句后面

    三、具名函数表达式的函数名只能在创建函数内部使用

    怎么来理解这话呢?不废话,直接上代码:

    var myFunc=function my(){
        
        console.log(1,typeof my);
        console.log(2, typeof myFunc);
    };
    myFunc();
    console.log(3,typeof my);
    console.log(4, typeof myFunc);
    //1 "function"
    //2 "function"
    //3 "undefined"
    //4 "function"

    上面的代码告诉我们对于具名函数构成的函数表达式,我们是不能再函数的外部进行调用,只能在具名函数的内部被调用,再来看一个例子:

    var obj={
        name:"林丽君",
        myFunc:function(){
            console.log(myFunc);
        }
    };
    obj.myFunc();
    //这个时候我们的程序会报myFunc is not defined(…)的错误

    那我们应该怎么样来访问呢,来看正确的写法:

    var myFunc=function(){
        console.log(myFunc);
    };
    myFunc();

    综合上面两段代码,我们的结论就是使用var或者非对象内部的函数表达式,可以访问到当前函数的变量,在函数内部不能访问到

    四、函数递归

    我们有下面一个累加的函数,看代码:

    function factorial(num){
        if(num<=1){
            return 1;
        }else{
            return num*factorial(num-1);
        }
    }

    如果我们这样做,来看看会发生什么事情: 

    function factorial(num){
        if(num<=1){
            return 1;
        }else{
            return num*factorial(num-1);
        }
    }
    console.log(factorial(3));//6
    var another=factorial;
    console.log(another(3));//6
    factorial=null;
    console.log(another(3));//报错factorial is not a function(…)

    这是因为我们的another()里面还继续调用我们的factorial(num-1);为了使我们的代码更加健壮,我们可以使用arguments.callee,它指向的是正在执行函数的指针,下面来看看它的使用方法:

    function factorial(num){
        if(num<=1){
            return 1;
        }else{
            return num*arguments.callee(num-1);
        }
    }
    console.log(factorial(3));//6
    var another=factorial;
    console.log(another(3));//6
    factorial=null;
    console.log(another(3));//6
    //记住,是当前函数的引用,所以当我们的函数有好几个参数的时候,就可以在arguments.callee()的里面添加几个参数
  • 相关阅读:
    直播报名| Kylin on Parquet 介绍及快速上手
    直播 | Apache Kylin & Apache Hudi Meetup
    1. MySQL体系结构和存储引擎——MySQL体系结构、存储引擎、连接MySQL
    深入理解Java虚拟机(第三版)-13.Java内存模型与线程
    Redis 字典实现
    JVM 判断对象已死亡?
    堆内存常见的分配策略、 经典的垃圾收集器、CMS与G1收集器及二者的比较
    String.intern() 和常量池
    Java 对象的创建过程(五步)、对象的内存布局、对象的访问定位
    Java内存区域(运行时数据区域)详解、JDK1.8与JDK1.7的区别
  • 原文地址:https://www.cnblogs.com/baby-lijun/p/5321835.html
Copyright © 2011-2022 走看看