函数是由事件驱动的或者当它被调用时执行的可重复使用的代码块。在使用函数时需要经过两个步骤,先声明函数后调用函数。
一、函数声明及调用
函数用于存储一段代码块,在需要的时候被调用,因此函数的使用需要经过两个步骤,先存储后使用,即声明函数后调用函数。
1)声明函数
声明函数有很多种方式,例如可以使用 function 关键字或者使用函数表达式声明,函数使用 function 关键字声明,需要保存的代码块包裹在大括号中。
语法:function 函数名(){ 保存的代码块 }
例1:
function sum(){
console.log(1);
}
需要注意的是,函数在没有调用前是不会执行的,函数名的命名规则和变量的命名规则一样。
2)函数调用
函数的调用非常简单,函数名后面加括号就可以了,即:函数名()。
例2:
//1. 声明,没有调用前没有作用
function sum(){
console.log(1);
}
//2. 调用
sum();
3)表达式声明
例3:
var f = function (){
console.log("函数表达式");
}
f();//表达式调用
二、函数的简单使用
函数都是有目的性的,即每个函数都有自己要实现的功能。
例1:声明一个函数,计算两个数的和 10 20
// 声明函数: function 函数名 (){}
function sum(){
console.log(10+20);
}
// 调用
sum();
例2:计算 0 至某个区域的累加和,假设这个区域是 0-100。
0-100之间的数,可以通过循环的形式获取,在循环中,变量i就是从0开始改变。
function sum() {
var sum = 0;
for(var i = 0; i <= 100;i++){
sum += i;
}
console.log(sum);
}
sum();
上面代码中,如果我们想计算的累加和的区域是 0-50,0-70,或者是其他的范围,是不是每种情况都需要写一个函数,还是有其他的办法可以处理?这个时候需要给函数增加实参、形参
三、函数的参数
函数存在的目的,就是方便多次调用,就像上面的那个例子,如果想要计算0-100的和,直接调用那个函数就可以实现想要的功能。
但是有些时候,我们还是想要计算和,只不过是0-70,那么我们怎么办,把上面那个100换成70就可以,如果是0-50换成50就可以,是不是可以这么理解,这个函数的作用是计算0-n之间的累加和,但是n是多少,就看我们需要的是多少。
如果在函数中,出现不能确定的、可变的值,我们会使用函数参数来实现。
四、函数的形参与实参
1)形参
在声明函数时,函数中一些不确定的值,我们可以先定义一个变量表示,这个变量我们就称之为形参。
例1:
function sum(a){
//var a
console.log(a);
}
上面代码中,a 就是形参,每一个形参都是一个变量声明,只不过省略了 var,但是这个时候的形参并没有值。
2)实参
在调用函数时,如果函数声明时有参数,就可以在括号中传入具体的值,这个叫实参。
例2:
function sum(a){
//var a = 10
console.log(a);
}
sum(10); //实参
上面代码中,在函数声明的时候声明了一个形参 a,但是这个时候的 a 没有值,在函数调用时传入数值 10,则 a 被赋值 10,即 a=10, 所以最后打印结果为 10。
3)多个参数
如果函数有多个参数,参数之间使用逗号隔开。
例3:
function sum(a,b){
console.log(a+b);}
sum(10,20);
多个参数时,形参和实参是一一对应的,第一个形参对应第一个实参,第二个形参对应第二个实参,以此类推。即a的值为10,b的值为20。
五、函数参数集合arguments
在 js 中,arguments 对象是一个特别的对象,当前函数的内置全局属性,表示当前函数的实参集合,它是一个伪数组,用法和数组类似。
例1:
function sum(a,b) {
console.log(arguments); // 实参集合
console.log(arguments.length,arguments[0]);//3,1
}
sum(1,2,3);
1)arguments 的使用
当参数个数不一定的时候,可以选择不设置形参,而是在函数内部通过获取arguments 得到实参,然后再进行操作。
例2:定义一个函数,计算所用的参数和(参数不固定);
function sum() {
var sum = 0;
for(var i = 0; i < arguments.length;i++){
sum += arguments[i];
}
console.log(sum);
}
sum(3,4,5);
sum(1);
2)arguments与函数中变量的关系
例3:
function fun(a) {
//a = 10
arguments[0] = 3; //arguments[0] = 10 = 3
alert(a); //3
var a = 2;
alert(a); //2
alert(arguments[0]); //2
}
fun(10);
如果参数名与局部变量名相同后面的会覆盖前面的,arguments 可以改变参数的值。
六、函数的参数类型
函数的参数可以是 js 数据类型中的任何一个,即可以是 number,string,boolean,null,undefined,引用类型(function,array,object)中的任何一个,但是null 和 undefined 作为参数没有任何意义而且有时还会报错,因此基本上不会将这两个作为参数。
例1:声明一个函数,将函数作为参数传入
function fun1(fun) {
fun();
}
function fun2() {
console.log(“hello”);
}
fun1(fun2);
函数fun1在调用的时候,实参传入的是函数fun2,所以函数fun1中的形参fun表示的就fun2,所以在函数fun1的函数体中通过fun()调用fun2。
七、函数中的问题
7.1、函数中重复命名问题
声明函数时,两个函数的名字一样,后面的函数会覆盖前面的函数,也就是说只会保留后面声明的那个函数。
例1:
var a = 10;
function fun(){
a = 20;
console.log(a);
}
fun();
function fun(){
a = 30;
console.log(a);
}
fun(); //30 函数名相同,后面的会把前面的覆盖掉
函数名不能相同,和不能重复声明变量相同,相同的变量名,后面的会把前面的变量的值覆盖
7.2、函数的形参和实参个数不同
实参在给形参赋值时,按照顺序从左往右,因此如果实参的个数大于形参的个数不会有影响,但是实参个数小于形参个数,就会有形参没有被赋值。
例1:
function fun1(a,b){
console.log(a+b);
}
fun1(10,20,40);//30 如果实参比形参多,取前面的个数
fun1(10);//NaN 如果实参比形参少,后面的参数没有值则为 undefined
八、函数中的 this
如果函数是作为事件发生时的处理函数,那这个时候函数中的 this 就为当前触发事件的那个对象,例如,如果是点击事件的话,点的谁 this 就是谁。普通函数中的 this 则是 window。
例1:函数做为事件处理函数
var oLi = document.getElementsByTagName(“li”);
for(var i = 0; i < oLi.length;i++){
oLi[i].onclick =function () {
// 当前调用方法的对象
console.log(this);
}
}
例2:普通函数
sum();
function sum() {
console.log(this); //window
}
对象的方法中的this指向的是对象本身。
例3:
var obj={
name:’张三’,
fn:function(){
console.log(this);//{name:’张三’,Fn:function}
}
}
obj.fn();