=> 等同于的意思

耦合 : 重复的代码太多了,代码的重复度太高了
高内聚:强功能性,高独立性
低耦合:把重复的代码提取出来 -> 模块的单一责任制
解耦合:使用函数可以很好的进行解耦合(减少重复)

最基本的函数写法 - 函数

  1. function test (参数){
  2. 函数执行语句
  3. }

函数名的命名规则
不能数字开头
字母 数字 下划线 $ 组成
小驼峰命名法 myFunction

JavaScript 保留关键字

引用

函数声明

  1. function test(){
  2. var a=1,
  3. b=2;
  4. console.log(a,b);
  5. }

表达式 字面量

  1. var test = function demo(){
  2. var a = 1;
  3. b = 2;
  4. console.log(a,b);
  5. // demo() 只能在函数内部调用
  6. }
  7. console.log(test.name);
  8. // demo();
  9. test();

匿名函数表达式 函数字面量(函数赋值给了一个字面量(变量))

  1. var test = function(){ //匿名函数
  2. var a = 1,
  3. b = 2;
  4. console.log(a,b);
  5. }

形参 实参

  1. var aa = Number(window.prompt('a')); ///33
  2. var bb = Number(window.prompt('b')); //22
  3. function test(a,b){ //形参
  4. console.log(a+b);
  5. }
  6. test(aa,bb); //实参

实参与形参不匹配的情况

  1. 实参多于形参的情况
  2. function test(a,b){
  3. //相当于 var a = 实参1,b=实参2;
  4. console.log(a,b); // 1 2
  5. }
  6. test(1,2,3)
  7. 实参少于形参的情况
  8. function test(a,b,c){
  9. //相当于 var a = 实参1,b=实参2;
  10. console.log(a,b,c); // 1 2 undefined
  11. }
  12. test(1,2)

查看实际参数 与形式参数

  1. function test(a,b){
  2. console.log(test.length); //查看形参参数
  3. console.log(arguments); //查看实参
  4. console.log(arguments.length); //查看实参长度
  5. console.log(arguments[0]); //查看具体某位实参的值
  6. }
  7. test(1,2,3)

image.png

实参求和

var a = 0;
function sum(){
    for(var i=0;i<arguments.length;i++){
        a+=arguments[i];
    }
    console.log(a);
}
sum(1,2,3,4,5,6)

实参在函数中的更改规则

//若函数调用时实参传值了 则可以在函数中更改实参
function test(a,b){
 a = 3; // => 等价于 var a; a  = 3
 console.log(arguments[0]);  // =>console.log(a);
}
test(1,2)

//若函数调用时实参没传值 则在函数中更改实参 无效
function test2(a,b){
 b = 3;  // => 等价于 var undefined; undefined  = 3
 console.log(arguments[1]);  //undefined  // =>console.log(undefined);
}
test2(1)

return的作用:1.终止函数执行(return 之后的语句都不再执行) 2.返回函数的值

function test(name){
    if(!name){
        return '您没有填写姓名!';
    }
    return name;
}
console.log(test('jiejie'));
console.log(test(''));

三目运算写法
function test(name){
    return name===''? '您没有填写姓名': name ;
}
console.log(test('jiejie'));
console.log(test(''));

逻辑或写法
function test(name){
    return name || '你没有填写姓名';
}
console.log(test('jiejie'));
console.log(test(''));

全局变量与局部变量

    a = 1;
    function test1() {
        var b = 2;
            a = 4;
        console.log(a); //4 
        function test2() {
            var c = 3;
                b = 5;
            console.log(b); //5
        }
        test2()
    }
    test1();


1.函数若不写 return 函数默认返回undefined;

作业

1.定义一个函数,从wp接收一个饮料的名称,函数返回对应的价格
2.定义一个函数,从wp接收第一个数,接收一个运算符号(+-*/%),接收第二个数,利用这个函数做运算,并返回运算结果
3.定义一个函数,从wp接收一个n,算出n的阶乘,不能使用for循环
4.定义一个函数,从wp接收一个n,算出斐波那契数列的第N位,不能使用for循环

作业1 .定义一个函数,从wp接收一个饮料的名称,函数返回对应的价格

错误写法

    var val = window.prompt("饮料名称","");

    function name1(test){
        switch (test) {
            case '可乐':
                return '3' //return 是跳出此函数
            case '雪碧':
                return '2.5'
            default:
                return '1';
        }
        console.log('return 会不执行return之后的语句') //因使用return跳出name1函数 所以此行不执行
    }
    console.log(name1(val));

误区 :为什么switch不用return退出循环2
1.return 是退出当前函数函数 上列中指name1 函数 如果 switch语句后面没有其他语句则 此处写return语句实现效果与break 相同
若switch语句之后有其他执行语句 使用return则会跳出函数不在执行 对应上列中的 console.log(‘return 会不执行return之后的语句’
2. switch是多分支选择语句并不是循坏语句

switch中return和break的作用一样吗? https://zhidao.baidu.com/question/294095125.html

正确写法

    var val = window.prompt("饮料名称","");

    function name1(test){
        var price;
        switch (test) {
            case '可乐':
                price = 3;
                break;
            case '雪碧':
                price = 2.5;
                break;
            default:
                price = 1;
        }
        return price;
    }
    console.log(name1(val));

作业2 .定义一个函数,从wp接收第一个数,接收一个运算符号(+-*/%),接收第二个数,利用这个函数做运算,并返回运算结果

//1.调用函数时不传参
        var num1 = parseInt(window.prompt("第一个数","")),
        num2 = parseInt(window.prompt("第二个数","")),
        symbol1 = window.prompt("运算符号","");
    function ex(){
        var numVal;
        console.log(symbol1);
        console.log(arguments);
        switch (symbol1) {
            case '+':
                numVal = num1 + num2;
                break;
            case '-':
                numVal = num1 - num2;
                break;
            case '*':
                numVal = num1 * num2;
                break;
            case '/':
                numVal = num1 / num2;
                break;
            case '%':
                numVal = num1 % num2;
                break;
            default:
                break;
        }
        return numVal;
    }
    console.log(ex());
2.调用函数时改变实参的值
        var num1 = parseInt(window.prompt("第一个数","")),
        num2 = parseInt(window.prompt("第二个数","")),
        symbol1 = window.prompt("运算符号","");
    function ex(symbol1){
        var numVal;
        console.log(symbol1);
        console.log(arguments);
        switch (symbol1) {
            case '+':
                numVal = num1 + num2;
                break;
            case '-':
                numVal = num1 - num2;
                break;
            case '*':
                numVal = num1 * num2;
                break;
            case '/':
                numVal = num1 / num2;
                break;
            case '%':
                numVal = num1 % num2;
                break;
            default:
                break;
        }
        return numVal;
    }
    console.log(ex('-'));
3.在函数内部改变形参的值
    var num1 = parseInt(window.prompt("第一个数","")),
        num2 = parseInt(window.prompt("第二个数","")),
        symbol1 = window.prompt("运算符号","");
    function ex(){
        var numVal;
        symbol1 = '-';
        console.log(symbol1);
        console.log(arguments);
        switch (symbol1) {
            case '+':
                numVal = num1 + num2;
                break;
            case '-':
                numVal = num1 - num2;
                break;
            case '*':
                numVal = num1 * num2;
                break;
            case '/':
                numVal = num1 / num2;
                break;
            case '%':
                numVal = num1 % num2;
                break;
            default:
                break;
        }
        return numVal;
    }
    console.log(ex());

作业3定义一个函数,从wp接收一个n,算出n的阶乘,不能使用for循环

递归求n的阶乘

        var n = parseInt(window.prompt("输入数",""));
        function ex(n){
            if(n<=1){
                return 1;
            }
                return n*ex(n-1);
        }
        console.log(ex(n));

作业4.定义一个函数,从wp接收一个n,算出斐波那契数列的第N位,不能使用for循环

        var n = parseInt(window.prompt("输入数",""));
        function ex(n){
            if(n<=2){
                return 1;
            }
                return ex(n-1)+ex(n-2);
        }
        console.log(ex(n));