函数

函数

定义

将需要反复使用的功能代码,封装成独立的模块,这个模块就是函数.

可以控制代码区块的运行,需要调用函数才会运行里面的代码块。

其数据类型为 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]
 
posted @ 2022-08-06 20:08  NomNom12138  阅读(43)  评论(0)    收藏  举报