Web前端-JavaScript--函数

                                       函数

如果有一段代码要反复执行
那么我们可以用大括号 包起来 起个名字 用来反复调用
这就是函数
 所谓函数就是一段代码可以反复执行 只要调用函数 就可以反复执行重复的代码

 

函数定义的格式:
    function 函数名(参数(形参)){
        函数体代码(要被反复执行的代码)

    }

  调用函数
  函数名(实参);
function show(){
        console.log("请不要秀");
    }

    show();
因为函数运行过程中可能需要外部(函数调用者)传进来指定的数据
所以函数需要参数
格式:
                        //形式参数
    function  函数名(参数1,参数2,参数3,...参数n){
    }
    函数调用: 传入实际参数
            要和形式参数 格式一样
    函数名(实参1,实参2,实参3,...实参n)
function plus(a){ //形参
        console.log(a+10);

    }

    plus(55) //实参
    plus(108)
形参和实参的数量不一致时的处理:
    形参大于实参时(需要三个参数 我却传了2个 少传了):
        多于的形参 值为undefined
    形参小于实参(需要三个参数  我却传了4个 多传了):
        多于的实参不予理会
    形参和实参数量相等:
        正常使用
function show(a,b,c) {
        console.log(a,b,c);
        
    }

//    show(5,6)
    show(5,6,7,8)
在js中没有函数重载  所以  函数不要重名
一旦重名 则后来的覆盖之前的
function show() {
        console.log("我是第一个show函数");
    }

    function show(a) {
        console.log("我是第二个show函数(带一个参数)");
    }
    show();
有些时候 函数运行需要 返回给外部一个结果
例如:
    计算的函数,计算完 把结果返回给外部使用
    这样比直接在函数内部把结果打印要好
    因为实际开发中 打印语句只是用来调试程序的
    总不能让用户去看控制台吧

   如何返回一个结果给给外部:
    在函数的最后一行 通过 return 结果;  返回一个结果给外部使用

   调用者接收返回值
   var  变量=函数名(参数);  调用函数并接收到返回值 存入变量中

   return 都可以返回哪些类型呢?
    所有类型都可以返回
 /*  function plus(a,b) {
        return a+b;
    }
    var result=plus(55,66);
    console.log(result);
    console.log(result*10);*/
  /* function jian(a,b) {
       return a-b;
   }
   console.log(jian(10,8));*/
函数的返回值几个注意点:
    1.函数里面如果没有return 那么函数默认返回undefined

    2.return 执行了 那么return后面的值 就是返回值

    3.有return语句 但是return后面没有跟任何结果
            那么返回值也是undefined
         意义:单纯的为了停止函数(return 表示一个函数结束)
    4.return 后面不能写任何代码 写了 也无法执行
            break和continue一样的效果

     5.实际开发中 函数的返回值要保持一致的 类型一致 不要随意切换类型
        或者干脆别反悔 否则 会导致程序混乱

函数创建有两种方式:
 


    1.函数模式
        function 函数名(){}

    2.变量模式创建
        var 函数名=function(){}

        function(){} --->匿名函数

 function show() {
        
    }
    
    var demo=function(a,b){
        
        console.log("我是demo函数");
        return a+b;
        
    };

    var result=demo(9,15);
    console.log(result);

 

函数名,函数体和函数加载
直接打印函数名,把函数代码整个以字符串打印出来
    函数名就代表整个函数

执行函数,就是等于执行函数的代码并且返回一个返回值
     函数名() 就是调用函数,执行函数里面的代码 并得到一个返回值

调用函数中如果包含函数,那么会先执行里面,再执行外面
    先执行内部函数 取得返回值  然后再拿着返回值 执行外部函数
    也就是内部函数的返回值 就是外部函数的参数
 /*function show() {
        console.log("我是一个show函数");
        
    }
    console.log(show);
    console.log(show());//调用函数并取得返回值  返回undefined*/
作为作用域:

    作用的域   作用:生效的意思  域:范围

    变量的作用域 就是变量的生效范围

在js中作用域分为两种:
    全局作用域:
        在函数外(不在任何一个函数内)  script标签内声明的变量
        就是全局变量  全局作用域下的变量
        在变量创建后的任意位置都可以使用

    局部作用域
        在函数内声明的变量就是局部变量 只能在当前函数内使用
        函数外再也无法使用

生命周期:
    全局变量:
        页面加载时 全局变量被创建
        页面关闭时 销毁

        生命周期比较长  容易空占内存
    局部变量:
        方法调用时创建   方法调用完毕销毁

        生命周期比较短 推荐使用
/*var a=10;   
    /!*console.log(a);
    
    function show() {
        console.log(a);        
    }

    show();*!/      
   function demo() {
        var num=99;
        console.log(num);    
    }

    demo();  
    console.log(num);//num is not defined  报错*/
隐式全局变量:
    不适用var创建的变量
  不推荐使用(就是不要使用!!!!!!!!!!!!)

 

demo();//函数提升到当前作用域第一行 所以当前作用域任意位置都可以调用

    /*
        在js代码开始一行一行往下运行之前
        存在一个预解析阶段
        相当于大概看一眼  下面的代码 都声明了 哪些变量和函数

        也就是 在预解析阶段  js程序会首先把 用var 声明的变量
        和用function创建的函数 进行一个提升

        变量提升:
            在预解析阶段 用var声明的变量可以被提升到当前作用域!!!的第一行
            全局变量被提升到全局第一行
            局部变量 被提升到局部第一行
            变量只提升变量名 不提升变量值
       函数提升
            在预解析阶段 用function创建的函数会被整个提升到当前作用域第一行

            函数提升 是提升整个函数
            在当前作用域任意位置都可以调用
   /*
       //全局变量提升
    console.log(a);//undefined
    
    var a=10;

    //模拟提升后的代码  var a;

    console.log(a);
    a=10;*/



//    局部变量的提升
    /*function show() {
        console.log(num);
        var num=10;
    }

    show();

    //提升后的代码
    function show() {
        var num;  //局部变量提升到局部第一行
        console.log(num);
        num=10;
    }*/
小知识点

函数不调用就不执行
函数名就等于整个函数
加载函数的时候,只加载函数名,不加载函数体
       函数不论是提升还是加载  只加载函数名  不执行不加载函数里面的代码
参数相当于局部变量
        函数的参数 只能在当前函数中使用 就是一个局部变量
就近原则使用变量
       如果函数内部调用变量时  函数内部有这个变量了 那么就不去外部找
两个平级的函数中的变量不会互相影响(可以使用相同的形参名)
    两个函数之间 内部的局部变量 完全不影响

 函数的高级

<script>

    //匿名函数----了解

   /* var show=function(){}   //匿名函数用作函数创建

    function qq() {

        return function(){};  //匿名函数可以作为返回值(js高级的闭包去讲)

    }

    function ww(fn) {

    }
    ww(function(){}); //匿名函数作为参数->回调函数(一会讲)

    //后面讲定时器

    setTimeout(function () {
        //页面加载完毕 5秒后 执行这里面的代码
    },5000)*/



   //函数也是一种数据类型---->了解
 /*  function show() {
       
   }
   console.log(typeof show);//function*/



 //递归函数--->了解
    //所谓递归函数 就是函数自己调用自己

    /*function show() {
        console.log("我是递归函数");
        show();

    }

    show();*/
    /*
        递归函数 最重要的是  结束条件


     */
    var i=0;
    function show() {
        i++;
        console.log("我是递归函数");
       if(i<10){//结束条件
           show();
       }

    }

    show();


</script>

 

函数的高级之回调函数 

<script>

    /*
        所谓回调函数:
            就是回来调用的函数 就是函数作为参数传入其他函数  让其他函数来调用

     */
    /*function show(fn) {

        console.log("我是show方法");
        
//        调用参数的函数
        fn();

    }

    /!*show(function(){
        console.log("我是回调,居然被调用了");
        
    })*!/


    show(function () {

    })*/

    
    //回调函数
    function show(fn) {
        console.log("我是show方法");
        fn(9,8);//函数调用

        
    }

    show(function (a,b) {
        console.log("我是回调函数",a,b);

    })
</script>

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章