回顾JavaScript基础——函数

    科技2022-07-10  159

    1:声明函数

    //声明一个函数 /* function 函数名(参数1,参数2,...){ //在内部定义函数体 } */ function put(something){ console.log("1" + something + "="); } function add(a,b){ return a + b; } function testNum(num){ if(num < 0 ) return; return num > 10; }

    2:调用函数

    //在声明的函数外部通过 函数名(参数1,参数2,...) 来调用函数 function put(something){ console.log("1" + something + "="); } put(2); function add(a,b){ return a + b; } add(1,2); console.log(add(1,2));//输出结果:3 //函数可以赋值给一个变量 var result = add(1,2) console.log(result);//输出结果:3 //变量可以作为函数的参数 console.log(add(result,5));//输出结果:8 function testNum(num){ if(num < 0 ) return; return num > 10; } console.log(testNum(-5));//输出结果:undefined console.log(testNum(15));//输出结果:true

    3:函数表达式

    function add(a,b){ return a + b; } console.log(add);//不加小括号的话,就会输出函数本身的值,也就是函数自己的定义 //可以将函数的定义赋值给一个变量,然后就可以跟普通函数一样进行调用 var plus = add; var res = plus(5,6); console.log(res);//输出结果:11 //定义一个函数将他赋值给一个变量,这时函数名可以省略不写 var multiply = function a(可以省略不写) (a,b){ return a * b; } console.log(multiply(2,3));//输出结果:6

    4:变量和函数的提升(Hoisting)

    //可以在底下声明这个变量,但是需要在输出语句前给它赋值 x = 5; console.log(x);//输出结果:5 var x; //可以在函数输出语句的下方声明函数 console.log(divide(8,4));//输出结果:2 function divide(a,b){ return a / b }

    5:默认参数

    //有默认参数的函数可以不用向他传递参数 function greetings(name = "z){ console.log("你好," + name);//输出结果:你好,z } greetings(); //向有默认参数的函数重新传递一个参数,会将默认值覆盖 greetings("zhou");//覆盖默认参数后的输出结果:你好。zhou //如果函数存在多个默认参数,且只有第一个参数有默认值,需要向第二个参数传递参数,可以将第一个参数传递为undefined function greetingsWithWeather(name = "z", weather){ console.log("你好," + name + ",今天是"+weather);//输出结果:你好,z,今天是晴天 } greetingsWithWeather(undefined,"晴天");

    6:递归:函数自己调用自己

    function sum(n){ if(n === 1){ return 1; } return n = sum (n-1); } console.log(sum(100));//输出结果:5050 //1 1 2 3 5 8 13 ...,每个数都是前两个数的和 function fib(num){ if(num <= 1){ return 1; }return fib(num-1)+fib(num-2); } console.log(fib(5));//输出结果:8

    7:arguments函数里内置的跟数组类似的参数集合

    function log(){ console.log(arguments[0]); } log("abc");//输出结果:abc function logs(){ console.log(arguments[0]); } logs("abc","bcd");//输出结果:abc function loges(){ if(let i =0,i<arguments.length;i++){ console.log(arguments[0]); } } loges("abc","bcd","efg");//输出结果:依次打印出abc bcd efg

    8:作用域,指自定义变量的可以范围,分局部作用域(函数内部定义的变量),全局作用域(在最外层定义的变量)

    //全局作用域的变量 var x = 5 //局部作用域 function add(a){ var y = 10; console.log(y);//输出结果:10 return a + x; } console.log(add(8));//输出结果:13 console.log(y);//输出结果:undefined。访问不到函数内部的变量 var num = 100; function multiply(num){ return num * 10; } console.log(multiply(4));//输出结果:40

    10:var,let(const定义的常量跟let定义的变量一样)

    相同之处:

    ​ 1)都是用来定义变量的;

    ​ 2)在函数内部定义的变量,出了函数,就不能再访问;

    ​ 3)定义的全局变量在哪里都能访问;

    不同之处:

    ​ 1)除了函数之外,在其他代码块内部定义的变量,出了函数是否能访问

    //在这个代码块外部访问不到代码块内部定义的let变量,但可以访问内部定义的var变量 var z = 6; if(z > 2){ console.log(z);//输出结果:6 var innerA = 17; let innerB = 17; } console.log(innerA);//输出结果:17 console.log(innerB);//报错 for (var i = 0;i < 10;i++){ console.log(i);//输出结果:0、1、2、3、4、5、6、7、8、9 } console.log(i);//输出结果:10 for (let i = 0;i < 10;i++){ console.log(i);//输出结果:0、1、2、3、4、5、6、7、8、9 } console.log(i);//输出结果:报错

    11:箭头函数

    //var 变量名 = () =>{} var greeting = () =>{ console.log("hello");//输出结果:hello } greeting(); //1:var 变量名 = 参数=>{} var greeting = name =>{ console.log("hello"+name);//输出结果:hello z } greeting("z"); //2:var 变量名 = (参数1,参数2,...)=>{} var greetings = (name,age) =>{ console.log("hello"+name+19);//输出结果:hello z 19 } greetings("z",19); //3:var 变量名 = 参数 => 方法 var num = x => x+1; console.log(num(2));//输出结果:3

    12:闭包(函数内部再定义函数)

    function squareSum(a,b){ function square(x){ return x * x; } return square(a) + square(b) } console.log(2,3);//输出结果:13 function person(){ let name = "z"; function getName(){ return name; } return getName; } var getName = person(); console.log(getName);//输出内部定义的getName函数 console.log(getName());//输出结果:z

    13:柯里化(curry:把一个接收多个参数的函数,变成一系列接收一个参数的内部函数)

    function addThreeNums(a,b,c){ return a + b + c; } console.log(addThreeNums(1,2,3));//输出结果:6 function addThreeNumsCurry(a){ return function(b){ return function(c){ return a + b + c; }; }; } console.log(addThreeNumsCurry(1)(2)(3));//输出结果:6 //如果存在固定的参数和变化的参数,这样就可以先计算出固定的参数的值, var fixedTwo = addThreeNumsCurry(1)(2); console.log(fixedTwo(4));//输出结果:7 console.log(fixedTwo(5));//输出结果:8 console.log(fixedTwo(6));//输出结果:9

    14:自执行函数(函数在定义完后,直接调用它自己)

    自执行内部的代码,外部访问不到,防止被篡改,内部也形成了自己的作用域,防止和外部的变量命名冲突

    var num1 = 10; (function(){ var num1 = 20; console.log(num1);//输出结果:20 })(); console.log(num1);//输出结果:10

    15:回调函数

    function request(cb){ console.log("请求数据");//1:先输出 cd("success");//调用回调函数 console.log("请求结束");//4:最后输出 } //定义一个回调函数 function callback(result){ console.log("执行回调");//2:其次输出 console.log("执行结果是;"+ result)//3:然后输出 } request(callback); /* //用箭头函数简化代码 request(result =>{ console.log("执行回调");//2:其次输出 console.log("执行结果是;"+ result)//3:然后输出 }) */
    Processed: 0.020, SQL: 8