前端基础(十一)_函数声明及调用、函数的形参与实参、arguments参数、函数的参数类型、函数中的问题

函数是由事件驱动的或者当它被调用时执行的可重复使用的代码块。在使用函数时需要经过两个步骤,先声明函数后调用函数。

一、函数声明及调用

函数用于存储一段代码块,在需要的时候被调用,因此函数的使用需要经过两个步骤,先存储后使用,即声明函数后调用函数。

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();

猜你喜欢

转载自blog.csdn.net/qq_43291759/article/details/128645624