JavaScript程序设计知识点【ES JavaScript】(G5)

159 阅读3分钟

函数【function】

A.【函数定义】

一些代码(为了完成一些特定的功能) 封装一起

完整的函数的格式

    function  函数名(形参1,形参3...){
               代码
        return  返回值 }

函数不会自动执行 需要手动调用

函数调用

    函数名(实参1,实参2...);

如果定义了形参 但是不传递实参进去 形参默认值就是 undefined;

如果没加 return 默认返回的是 undefined

如果函数中有return的话 函数执行return立即停止

定义一个求两个数字的和的函数

    function add(a, b) {
        var sum = 0;
        sum = a + b;
        return sum;
    }
    var sum = add(2, 3);
    console.log(sum);
    console.log(add(70, 80));

不带形参返回值函数

    function print(){
         console.log("Hello World!!!");
    }

    print();
    print();

如果定义了形参 但是不传递实参进去 形参默认值就是undefined;

如果函数中有return的话 函数执行return会立即停止

    function print(arg){
        console.log(arg);
        // return;
        // console.log(12323332);
    }
    print("你好");
    print("静夜思");

如果定义了形参 但是不传递实参进去 形参默认值就是 undefined;

如果没加 return 默认返回的是 undefined

如果函数中return的话 函数执行到return会立即停止

 print();

可以定义一个变量接收函数返回值

    var res = print("今天开始学习函数了 好激动");
    console.log(res);

B.函数声明提前:

    print1("hello");
    function print1(arg) {
         console.log(arg);
     }

以上的代码在执行时 正确的位置

    function print1(arg){
      console.log(arg);
    }
    
    print1("hello");

变量提前会在 函数前面

     add();
     var num=1;
     function add(){
         console.log(num);
     }

真正的执行顺序

      var num;
      function add(){
          console.log(num);
      }
      add();
      num=1;

C.函数的作用域:

js在es6 之前 没有块级作用域 只有全局作用域和局部作用域

全局作用域

全局作用域: 在函数外部定义的变量(在任何地方都能使用) 在函数内部定义的变量我们成为局部变量

调用函数时优先使用函数内部的变量 没有的话再找全局变量 函数内部变量声明也会提前

    var num = 1;
    function add(){
        var num=2;
        console.log(num);
        num++;
        return num;      
    }
    console.log(add());
    console.log(num);      

//    var num ;
//    function add(){
       
//        num=2;
//        console.log(num);
//        num++;
//        return num;
//        var num;
//    }
//  num=1;
//  console.log(add());
//  console.log(num);

D.【try catch 捕获错误】

为了避免 程序出现错误 而引起整个程序的崩溃我们可以使用错误捕获

         num++;
            console.log("我能执行吗");

        // try执行可能出现错误的代码
        try {
             var num=1;
           num++;
            // catch当 try中的代码出现错误时会捕获
        } catch (error) {
            console.log(error);
        }finally{// 无论try中的代码是正确的还是错误的 都会执行 finally中的代码
             console.log("finally")
        }
        console.log("我能执行吗");
        function add(num1,num2){
            try {
                var res = num1+num2;
               
            } catch(err){
            }
             return res;
        }

/

E.【arguments对象】

系统内置专门用于储存函数传递的参数

function add() {
        console.log(arguments);
        // 我们可以通过索引号来获取到 传递的实参

        // console.log(arguments[0],arguments[1]);

        var sum = 0;
    //    arguments.length 表示的参数的个数
        for(var i =0;i<arguments.length;i++){
                sum+=arguments[i];
        }
        return sum;

    }

    console.log(add(1, 2,3,4,5,6,7,8,9));

F.递归函数(函数之间的相互调用)

如果函数 最后返回值是调用函数本身 我们称为递归函数 注意一定要避免死循环 一定要有明确退出条件

【经典案例】判断 斐波那契数的第 20位是多少

    //  1 1 2 3 5 8 13   
    //   第 n的黄金数  = 第n-1位的黄金数 + 第n-2位的黄金数  

    function goldNum (n){   
        if(n==1||n==2){
            return 1;
        }
        return  goldNum(n-1)+goldNum(n-2);
    }
    /*
       g(5)           g(4 )            +        g(3)     
                     g(3) +g(2);               g(2)+g(1) =1+1; 
                     g(2)+g(1)+1 = 3   +         2
    */ 
    //   console.time("timer");
    //  console.log(goldNum(40));
    //  console.timeEnd("timer");

G.函数表达式

定义一个变量 然后给这个变量赋值一个函数

    console.log(add); // add的声明会提前 
    var add = function (a,b){
        return a+b;
    }
   
console.log(add(2,3)) 

(函数很重要,在后期的实际开发过程中,几乎都需要它,现在打好基础,将来少留遗憾!!!)