1.函数的定义
定义函数使用关键字 function
1、关键字定义方式:
function 函数名(参数1,参数2...){
功能//函数体
}
function showInfo(name,age,hobby){
alert('大家好,我叫' + name + ',今年' + age + '岁,我喜欢'+hobby);
}
2、字面量定义方式:
var 函数名 = function(参数1,参数2...){
//函数体
}
var showInfo = function(name,age,hobby){
alert('大家好,我叫' + name + ',今年' + age + '岁,我喜欢'+hobby);
}
说明:函数名就是一个变量
3、Function构造函数(很少用)
var 函数名 = new Function(参数,函数体);
var showAge = new Function('age','alert(age)');
函数有什么用?(理解)
将重复的代码放到一个函数中 ,可以做到:
1、减少代码的编写(代码重用)
2、便于修改和控制(维护)
3、需要的时候再使用
函数的特点
1、函数自己无法运行,调用时才会执行函数体内的代码块
2、可以多次使用
参数(重)
1、什么是参数?
在定义函数的时候,在()里面可以定义一些变量,用于接收调用的时候传过来的数据
函数的()中定义的变量及调用时传入的数据都是参数
参数:
1、函数的()中定义的变量
2、调用函数时传入的数据
2、为什么要定义参数?
1、让函数变得更加灵活(实现函数的多功能)
2、实现函数的作用
3、怎么定义参数(形参)?(形式参数)
1、在函数定义的时候括号里面写的变量
2、形参可以定义多个
3、每个形参之间用逗号隔开 ,
4、形参其实就是个变量(遵循变量规则)
function print(arg1,arg2,arg3...){}
4、怎么传入参数(实参)?(实际参数)
1、调用函数时,写在括号里的值(变量)就称之为 实参
2、多个实参之间使用逗号隔开
参数解读(重)
1、形参和实参什么关系?
a、形参和实参之间是一一对应的关系
b、如果对应的形参没有传值,那么值是undefined
2、javascript函数的参数与大多数其他语言的函数的参数有所不同。函数不介意传递进来多少个参数,也不在乎传进来的参数是什么数据类型,甚至可以不传参数。
arguments(重)
1、函数内部自带的一个对象,形式和数组类似(被Arguments创造出来的)
2、存储的是所有的实参(调用功能传入的参数)
3、可以使用[]及下标访问arguments中的内容 arguments[0] 访问第一个实参
4、可以使用 arguments.length 确定传入实参的个数 (arguments['length'])
最常用的用途: 判断传入参数的个数(根据参数个数做不同的事情)
1、定义一个加法功能,计算传入的所有数字的和*/
/*function Sum(){
var sum=0;
for(i=0;i<arguments.length;i++){
sum+=arguments[i];
}
alert(sum);
}
Sum(3,4)*/
/*//2、定义一个功能getMax,传入任意个数字,返回最大值
function getmax(){
var max=0;
for(i=0;i<arguments.length;i++){
if(arguments[i]<arguments[i+1]){
max=arguments[i+1];
}
}
alert(max);
}
getmax(2,6,4,20,18,13);*/
//3、定义一个运算功能,参数为(x,y),当传入1个数字时,求x的阶乘,如果传入两个数字,求x的y次方
function getNam(){
var num=1;
if(arguments.length==1){
for(var i=1;i<=arguments[0];i++)
{ num*=i;
return num;
}
}else{
return Math.pow(arguments[0],arguments[1]);
}
}
var a=getNam(3,2);
console.log(a);
什么是递归?
自己玩自己
function f(){
console.log(1);
f();
}
间接的玩自己
function f1(){
f2();
}
function f2(){
f1();
}
对于递归而言,最重要的是跳出结构,因为只有跳出结构才可以有结果
其实所谓的递归就是化归思想
递归调用函数,写一个递归函数,最终还是要转换为自己这个函数
递归的思想就是将一个问题转化为一个已解决的问题来实现。
注意:递归就是在过程或函数里调用自身;使用递归策略时要注意的几个条件
1、必须有一个明确的递归结束条件,称为递归出口。
2、递归需要有边界条件、递归前进段和递归返回段。
3、当边界条件不满足时,递归前进。当边界条件满足时,递归返回。
//求1到一百的和
function fn(n){
if(n<1)
{
return 0; //跳出循环的条件
}
return n+fn(n-1);//依次递减的规律
}
var sum=fn(100);
console.log(sum)
变量的声明提升
浏览器在执行代码之前,会对所有的声明语句,进行提升(把声明代码提升至该作用域的最前面)然后再按顺序执行代码
var n = 10;
function test(){
console.log(n); //undefined
var n = 20;
console.log(n); //20
}
test();
var x = 100;
function test(x){
x+=100;
}
test(x);//执行完释放
console.log(x); //100变量的声明提升
tt='ee';
function b(){
function test(){
alert(tt);
tt='ff';
}
test()
}
b()
var tt='123'
function test(){
var tt;
alert(tt);
tt='ff';
}
test();
2、tt='ee';
function b(){
function test(){
alert(tt);
/*var tt='ff';*/
}
test()
}
b()
实战
1、
console.log(a);
var a = 10;
console.log(a);
2、
console.log(test);
var test = function(){
console.log(1);
}
function test(){
console.log(2);
}
console.log(test);
思考1
var age = 10;
function test(){
console.log(age);
}
test();
打印什么?
思考2
var age = 10;
function test(){
console.log(age);
var age = 20;
console.log(age);
}
test();
打印什么?
编写一个函数,计算两个数字的和差积商
function calculator(num1,num2,sign){
switch(sign){
case "+" : console.log(num1+num2); break;
case "-" : console.log(num1-num2); break;
case "*" : console.log(num1*num2); break;
case "/" : console.log(num1/num2); break;
}
}
编写函数,判断一个字符串的内容是不是纯数字
function isANumber( str ){
var n = Number(str);
if( typeof n == "number" && !isNaN(n) ){
alert("是一个纯数字!");
} else {
alert("不是一个纯数字");
}
}
isANumber("df589");
isNaN(); 判断一个变量是否为NaN 是的话返回true 不是的话,返回false//1、编写函数,判断一个字符串的内容是不是纯数字
function isNumber(str) {
if(isNaN(Number(str))){
result.value='非数字'
}else{
result.value='纯数字';
}
}编写函数digit(num, k),函数功能是:求整数num从右边开始的第k位数字的值,如果num位数不足k位则返回0。
function digit(num, k){
for(var i=1; i<k; i++){
num /= 10;
}
return parseInt(num)%10;
}
console.log( digit(123456, 8) );
7、编写一个函数,计算任意两个数字之间所能组成的奇数个数,数字必须是个位数。
//比如:计算0~3之间能组成的奇数是: 01、03、13、21、23、31
function fuName(a,b){
var sum;
for(i=0;i<=b;i++){
for(j=0;j<=b;j++){
if(j%2!=0&&j!=i){
sum=i*10+j;
document.write(sum+" ");
}
}
}
}
fuName(3,5)