函数
函数
定义
将需要反复使用的功能代码,封装成独立的模块,这个模块就是函数.
可以控制代码区块的运行,需要调用函数才会运行里面的代码块。
其数据类型为 Function
好处
- 
- 
功能代码可控 
分类
- 
内置函数 (js给我们提供的) 
- 
自定义函数 (自己定义) 
创建函数
1.语句定义法(在任意位置都可以调用)
function 函数名([参数]){
      //功能代码
}
2.表达式定义法(只能先声明后调用)
 var 函数名 = function([参数]){  //匿名函数声明 
    //功能代码
 }
3.Function(a,b...,body) 构造函数。
Function是js内置的一个构造函数,可以创建一个函数出来。
可以有多个参数,最后一个参数是函数体(代码区块)。
var getName2 = new Function('x', 'y', "var name2='name2';console.log(name2,x+y);");
getName2(1, 2);  //name2 3
* 等价于
* var getName2 = function(x,y){var name2='name2';console.log(name);}
var fun = Function('console.log(123);')
fun()  //123
eval
eval() 可以把字符串作为js语句运行
eval()里面可以创建全局变量,会影响程序运行,容易造成安全隐患,一般不要使用
一般用Function() 代替eval功能,Function是在函数体执行js语句,里面创建的是局部变量,不会影响程序。
    var str = "var a=100";
    eval(str);
    console.log(a);   //100
调用函数
- 
一般调用: 函数名([参数]) 
- 
事件调用 触发事件后调用函数 
参数
形式参数(形参):定义函数时所传递的参数 num1,num2
实际参数(实参): 调用函数时所传递的参数 11,22
注意:
- 
参数传递: 只能将实参 传递给形参,即单向传递 
- 
形参只能是变量; 实参可以是变量,常量,表达式 
- 
实参 小于 形参的数量时,多余的形参值为undefined 
- 
实参 大于 形参的数量时,自动忽略多余的实参 
function test (num1,num2){
        var sum = num1+num2;
        //console.log(num1+num2)
        return sum;
    }
    sum = test(11,22);   //两个数字
可以给参数指定默认值
 function f1(width, height, name = "test") { 
      console.log(width, height, name);
    }
    f1(10, 20); //10 20 'test'
返回值
返回值 return 调用函数之后,函数执行完成后通过return可以把指定数据返回 /退出函数
函数没有写return返回值时,打印结果为undefined
    function sumFn() {
      console.log(123)
    }
    console.log(sumFn());   //undefined
直接打印函数名时 打印结果为函数本身
console.log(sumFn);  //函数名    整个函数
arguments对象
只有函数才有的一个内置对象
里面存储了所有传递过来的实参 适合不明确参数个数的情况
可以按照数组的方式遍历arguments
function fn(){
        // arguments[0]
        // arguments.length
        //console.log(arguments)
        for (var i=0;i< arguments.length;i++){
            console.log(arguments[i])
        }
    }   
回调函数
函数的参数可以是任意数据类型,把一个函数作为参数传递给另外一个函数,就叫回调函数
 var f3 = function (data) {  //创建一个函数
   console.log("callback:", data)
 }; 
 
 function getData(callBack) {   //创建一个参数为函数类型的函数
       console.log(123);
       callBack(3333);   // 运行callBack相当于运行的f3 等价于 f3(3333)
    }
   
 getData(f3)  //callback: 3333 
递归函数
递归函数,函数调用自身函数。
本质 :实现了循环
使用递归的时候需要注意,不要无效的去调用自身函数,容易造成内存溢出。
函数内部需要有条件,不能无限调用递归。
    // 递归函数阶乘案例: 1*2*3*4*5....;
    // 1、创建一个函数,函数需要写出想要的结果。
    // 2、递归函数必须要有一个结束条件,不能无限调用。
    // 3、递归函数都是从最里层开始计算
    function countNum(num) {
      if (num === 1) {
        return 1;
      }
      return num * countNum(num - 1)
    }
变量作用域
全局变量 : 定义在函数外面的属于全局变量
局部变量 : 定义在函数内部的属于局部变量
 var a = 1;
 var c = 1;
    function test() {
        var b = 2;
        var a = 3;  //重新声明了一个局部变量a
        c = 3;    //修改了全局变量c的值
        console.log(a)  //3
        console.log(b)  //2
        console.log(c);  //3
    }
    test();
    console.log(a);   //1
    console.log(b);   //报错 b is not defined
    console.log(c);   //3
闭包
闭包:函数内部返回函数
闭包的作用: 把函数内部的局部变量持久存放在内存中。
 function f() {
      var count = 1;
      return function () {
        count++;
        return count;
      }
    }
    var fb = f();
    console.log(fb); //返回的函数本身
    fb();  //count=2
    console.log(fb()); //3
函数的属性和方法
name属性 返回函数名称
function f1() { }
console.log(f1.name); //f1
var f2 = function ftest() { }
console.log(f2.name);  //ftest
var f2 = function () { }
console.log(f2.name);  //f2
length属性 返回函数参数的个数
  function f3(a, b, c) { 
     var name = "test" 
  };
  console.log(f3.length) //3
toString()方法 把函数作为字符串返回
 console.log(f3.toString());  //‘function f3(a, b, c) { var name = "test" }’
冒泡排序
function mySort(arr) {
        //第一层循环 来控制冒泡需要的轮数
        for (var i=0;i<arr.length-1;i++) {
            //第二层循环 控制每一轮比较的次数
            for(var j=0;j<arr.length-1-i ;j++){
                //比较相邻两个元素的值
                if (arr[j] > arr[j+1]){
                    //交换两个数组元素的值
                    var tmp = arr[j]
                    arr[j] = arr[j+1]
                    arr[j+1] = tmp
                }
            }
        }
        return arr
    }
    var arr = [11,22,3,1,23];
    arr = mySort(arr);
    console.log(arr);  //[1,3,11,22,23]
 
                     
                    
                 
                    
                 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号