Go to comments

JavaScript 函数小练习

一、函数小练习

1、写一个函数,功能是告知你所选定的小动物的叫声。

写一个函数,首先函数定义一个功能,函数才能代表功能,任何东西都没有函数定义功能更加准确,这是一个抽象通式。

告知你所选定的小动物叫声,意思就是这个函数给我们留了一个接口,我们可以去选定它,这个接口就是一个参数,然后里面根据我们传进去的不同的参数,调出不同的小动物叫声。

函数名scream尖叫的意思,参数animal小动物

为了防止switch往下漏要要写break,这里除了break之外还有其它办法吗?写return也行,它更高级直接把函数终止了

function scream(animal){

    switch(animal){

        case "dog" :
            document.write('才旺 气旺 运气旺');
            break;

        case "cat" :
            document.write('喵~瞄~');
            return ;

        case "fish" :
            document.write('o~o~o~');
            return ;

    }
}


scream('dog');
document.write('<br/>');


scream('cat');
document.write('<br/>');


scream('fish');

3、定义一组函数,输入数字,逆转并输出汉字形式。

输入数字是很简单的功能不用看,关键重要点是“把数字逆转并输出汉字形式”把数字逆转123逆转321,然后还不能输出321的数字形式,必须输出汉字形式。

这里面有两个功能,第一个功能是数字逆转,第二个功能是把数字换成汉字


第一步:处理字符串

由于window.prompt('input') 输入的是一个字符串,需要把它转换成数字,然后在把数字逆转,现在有一个比较简单的方法

字符串的charAt()方法,,可以把字符串的每一个拿出来,  str.charAt(0)  就是把字符串的第零位拿出来,str.charAt(1) 就是把字符串的第一位拿出来,能拿出来翻转就好办了

var str = "abc";

console.log(str.charAt(0)); // a
console.log(str.charAt(1)); // b
console.log(str.charAt(2)); // c

还有一个更简单的方法有点过于潇洒了,就是直接写方括号像拿数组的每一位一样,因为js的字符串底层是基于数组的

var str = "abc";

console.log(str[0]); // a
console.log(str[1]); // b
console.log(str[2]); // c

而且字符串还有长度属性 length ,完全可以像数组一样存取,但最好用标准方法 charAt() 

var str = "abc";

console.log(str.length); // 3

字符串也可以“加等于”,因为加等于的根本含义就是加上你之后再赋给我自己,加号有字符串链接的意思,所以字符串也能加等于

var str = '123';

str += "234";

console.log(str); // 123234

把字符串"123"倒过来

var num = window.prompt('input'),
    str = "";

// 直接倒着拿字符的每一位,然后拼接就可以了,数组是从0开始算的,所以num.length-1是字符串的长度,直接倒着拿字符串拼上每位就可以
for(var i = num.length - 1; i >= 0; i--){

    str += num[i];

}

console.log(str); // 输入123反向输出321

输入123反向输出321没问题了,下面反向的同时要把每一位数字翻译成汉字,再拼接的时候翻译最好,因为循环里面已经把每一位都拿出来了

如果有一个函数在循环里面,把每一位数字处理后返回汉字是最好的。如果是一个单独的功能用函数,函数的意思就是抽象功能


第二步:定义一个函数,把每个数字转成对应的汉字:

如果是一个单独的功能,就把单独的功能抽象出来,定义一个函数taransfer()(taransfer是变换的意思)把传进去的数字转成汉字返回出来

function transfer(target){

    switch(target){
        case "1" :
            return "壹";
         case "2" :
            return "贰";
        case "3" :
            return "叁";
        case "4" :
            return "肆";
        case "5" :
            return "伍";
        case "6" :
            return "陆";
        case "7" :
            return "柒";
        case "8" :
            return "捌";
        case "9" :
            return "玖";
        case "0" :
            return "零";
    }

}


第三步:severse()方法

severse是逆转的意思,下面是逆转的方法severse()

function reverse(){

    var num = window.prompt('input');
    var str = "";

    for(var i = num.length - 1; i >= 0; i--){

    str += transfer(num[i]); // 1. 执行这一行的时候,先执行后面的这个transfer(num[i])函数,
                             //    这个函数执行完之后把函数结果返回,才能接着往下执行。
                             // 2. 因为js是单线程的,它是有执行顺序的,
                             //    所以到这先执行transfer(num[i])转换出汉字,再进行字符串链接
    }

    document.write(str);
}

function transfer(target){

    switch(target){
        case "1" :
            return "壹";
         case "2" :
            return "贰";
        case "3" :
            return "叁";
        case "4" :
            return "肆";
        case "5" :
            return "伍";
        case "6" :
            return "陆";
        case "7" :
            return "柒";
        case "8" :
            return "捌";
        case "9" :
            return "玖";
        case "0" :
            return "零";
    }

}

reverse(); // 填写123会返回“叁贰壹”

4、写一个函数,实现n的阶乘。

这个求阶乘的方法叫递归,递归的两个注意点

1) 找规律

2) 找出口(就是找停的那个点)

function jc(n){

    if(n == 1){
        return 1;
    }

    return n * jc(n - 1);
}

console.log(jc(3)); // 6

console.log(jc(5)); // 120


二、函数作用域初探

全局变量 和 局部变量的区别

在script标签里面,全局上定义的变量叫全局变量,然后在函数里面定义的变量叫局部变量,下面代码中a是全局变量、b就是局部变量

有个规则是,在函数里面可以访问外面全局里面的变量a,函数外面不能用访问函数里面的变量b

var a = 123; // 全局变量

function test(){     
    var b = 123; // 局部变量
    document.write(a);
}

test(); // 执行test返回123,函数能访问外边的变量a,能访问就可以修改,在它的基础上就可以累加累乘

document.write(b); // 函数外边不能访问到函数里面的变量b,返回报错信息:Uncaught ReferenceError: b is not defined

符合一个原则,里面的能够看到外面的,外面看不到里面的


这个规则还可以引申一下,在函数test里面,再定义一个函数demo

在demo函数里面可以访问到它外边的变量b和a的,因为demo函数是最里面的一层,里面的一定可以访问到外面的,不管外面的多少层它都能访问到,但外面的就是不能访问里面的,在test函数的区域里面是不能访问到变量c

var a = 123;

function test(){

    var b = 123;

    function demo() {

        var c = 234;

        document.write(b);

        document.write(a);
    }

    demo();

    document.write(c); // 那在test()的区域里面能访问c吗?是不能访问的。

}

var ddd = test();

这是一个链条式的关系,最里面的权限最高,越到外面的权限越低,就好像小孩子可以管父亲要钱,向爷爷要钱,但是反着长辈向小孩子要钱是不行的,符合我国的民情。


函数可以形成一个作用域,这个作用域像一个小的房间一样,这个房间有阻隔外界的作用,

比如两个房间之间,test房间里面设置的变量a,demo房间里是不能访问的,他俩之间是两个独立的房间,不能到隔壁去拿东西一样。

但是如果全局定义一个global变量,两个函数都能访问全局的global变量,都能修改全局变量,两个函数修改的都是一个。

var global = 100;

function test(){
    var a = 123;
}

function demo(){
    var b = 234;
}

再一次说明:

1). 函数里面可以访问外面的,外面不可以访问到函数里面

2). 函数之间是彼此独立的,不可以相互访问,这是函数之间的访问关系


三、挑战型作业

题目:

比如在银行里存钱,把读法写出来:

10000 -> 壹萬圆

10001 -> 壹萬零壹圆(中间三个零只读一个)

10010 -> 壹萬零壹拾圆

10100 -> 壹萬零壹佰

11000 -> 壹萬壹

100100 -> 拾萬零壹佰

101000 -> 拾萬壹仟圆(没有读零)


读零和不读零有一个规则:

千分位如果是零必须得读,如果千分位不是零,就不用读千分位的那个零,

千分位一旦有值(1-9)不用读零(一百万九千元、一千万九千)

千分位如果是零,一百万零五百,必须要读零



Leave a comment 0 Comments.

Leave a Reply

换一张