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)不用读零(一百万九千元、一千万九千)
千分位如果是零,一百万零五百,必须要读零
