JavaScript 函数小练习
一、函数小练习
1.写一个函数,功能是告知你所选定的小动物的叫声
2.写一个函数,实现加法计数器
3.定义一组函数,输入数字,逆转并输出汉字形式
4.写一个函数,实现n的阶乘。
5.写一个函数实现菲波那契数列
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). 函数之间是彼此独立的,不可以相互访问,这是函数之间的访问关系
三、挑战型作业
题目:
要求输入一串低于10位的数字,输出这串数字的中文大写
eg:input :10000 output:壹万
eg:input :1001010 output:壹佰万壹仟零壹拾
比如在银行里存钱,把读法写出来:
10000 -> 壹萬圆
10001 -> 壹萬零壹圆(中间三个零只读一个)
10010 -> 壹萬零壹拾圆
10100 -> 壹萬零壹佰
11000 -> 壹萬壹
100100 -> 拾萬零壹佰
101000 -> 拾萬壹仟圆(没有读零)
读零和不读零有一个规则:
千分位如果是零必须得读,如果千分位不是零,就不用读千分位的那个零,
千分位一旦有值(1-9)不用读零(一百万九千元、一千万九千)
千分位如果是零,一百万零五百,必须要读零