js的函数可以大致理解为c/c++/java里面的函数,但要比他们活跃的多,他是我们模块化编程的基础,也是下面js进阶的关键,这也是为什么把它单拿出来的写的原因。
- 我们先来看一个简单的函数
function add(a,b){ //定义一个add函数,他需要两个参数a,b;
console.log(a+b) //该函数的操作结果是打印a和b的和;
}
add(1,2); //执行函数,实参为1,2;
- 这里我们可以看到函数的定义要比其他的语言要简单的多,只需要function关键字(注意都是小写,因为还有Function函数对象,下来我们会讲解)
- 当然,我们开始就说了js函数是非常灵活的,他也可以用声明变量的形式定义,如下:
var add = function(a,b){
console.log(a+b);
}
add(1,2);
这里我们看到和上面声明的方式并没有太大的区别,但这里有一个js的理念就是一切皆对象,函数也是对象,我们先声明了一个函数对象,然后赋值给变量add,下来直接调用变量就可以了~
另一种定义方式就是Function,我们看一个例子
var add = new Function('a','b','console.log(a+b)');
- Function就是我们进阶教程里要讲到的虚拟类,在实例化的时候前面的参数都是参数,后面的一个是函数体本身。应该是鉴于它比较麻烦,在实际应用中使用的并不多。
说完了如何定义函数,就要探讨一下函数的内部细节。。。
- return关键字
说到这里有过其他编程经验的人就会看到function的定义并不需要显示的声明有无返回值和返回值类型。对,就是这么任性,想返回就返回,不想返回就不返回(当然着需要根据函数的实际用途来定哈!);return关键字就是来干这个事的,返回值。
function add(a,b){
return a+b;
}
add(10,20);
这里我们依旧用这个简单的不能再简单的add函数,唯一的改变就是里面不再是console/document.write等方法,改成了return,当我们调用add函数的时候,函数就返回给我们两个参数的和。当然,return也是比较任性的,想返回啥就返回啥,而且啥类型都可以,这个自己可以去尝试,在此不赘述!
arguments关键字/对象
它是函数的一个核心,函数本身就是封装提高复用性,所以在不同的环境中,不同参数的引入就成了函数的关键。上面的例子我们已经看到在add函数中有a和b两个形参,这是显示定义形参的方式,下面我们把其他方式看一下。
function add(){
//console.log(arguments); //输出[object arguments]
var a = arguments[0];
var b = arguments[1];
return a+b;
}
add(10,20);
- 在这里我们并没有显示的定义形参,但执行函数同样会输出30;这就要归功与arguments对象,在函数执行时,arguments获取实参列表。原则上可以定义任意多的参数,但在保证不报错的情况下少于255(当然没人会这么搞,-);
- 上面我们写的函数都是知道多少个参数的情况下写的,在有些时候我们是不知道多少个参数的,这时候我们就需要用上重载,重载有两种方式
- 第一种:
function add(){
if(arguments.length == 1){
return arguments[0];
}else if(arguments.length == 2){
return arguments[0]+arguments[1];
}else if(...){
...
}
}
add(1,2);
add(1,2,3);
//好尴尬,如果只有一两个还好,如果多的话就挂了..0.0..
* 第二种
function add(){
var count = 0; //函数内部定义局部变量
for(i in arguments){
count+=arguments[i];
}
return count;
}
add(1);
add(10,20);
add(100,200,300);
//通过for-in函数成功将这个重载问题搞定,以后用那个就看个人兴趣啦啦啦~
函数基础基本就是这样了,在进阶教程中会讲述基础函数的封装/闭包/类等,凡是欲速则不达,打好基础才是进阶的关键。