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()的里面添加几个参数
  • 相关阅读:
    yum安装报错“rpmts_HdrFromFdno: Header V3 DSA signature: NOKEY, key ID 1e5e0159”
    EM64T和64位是不是一个概念啊?他们有什么区别啊,怎么区分啊?
    Can't load IA 32-bit .dll on a AMD 64-bit platform
    中间件——Oracle Fusion Middleware
    Does Windows have a limit of 2000 threads per process?
    java8 Lambda Stream操作list,map
    Mybatis优雅存取json字段的解决方案
    网站服务器架构部署方案发展
    springboot flowable Cause: org.xml.sax.SAXParseException; lineNumber: 25; columnNumber: 14; 元素类型为 "include" 的内容必须匹配 "EMPTY"
    java.lang.NoClassDefFoundError: javax/el/ELManager
  • 原文地址:https://www.cnblogs.com/baby-lijun/p/5321835.html
Copyright © 2011-2022 走看看