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

简介: 本文介绍了JavaScript中函数的声明及调用、形参与实参的概念、arguments对象的使用、函数参数的类型以及函数中this的作用。通过示例代码详细解释了函数如何接收参数、如何处理参数个数不匹配的情况,以及函数在不同上下文中this的指向。

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

一、函数声明及调用

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

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();
目录
相关文章
|
4月前
|
前端开发
调试前端时,在浏览器上修改参数并重新调用接口
有时候我们的页面点击过了,但是接口出问题,想修改参数再调用一次,一般是用apiPost工具把接口复制,再加上token和参数,但是这样非常的效率比较低。
356 0
|
4月前
|
前端开发
[牛客网-前端大挑战QD2] 获取url参数
[牛客网-前端大挑战QD2] 获取url参数
48 0
|
1月前
|
前端开发 JavaScript
这篇文章介绍了如何使用form表单结合Bootstrap格式将前端数据通过action属性提交到后端的servlet,包括前端表单的创建、数据的一级和二级验证,以及后端servlet的注解和参数获取。
这篇文章介绍了使用AJAX技术将前端页面中表单接收的多个参数快速便捷地传输到后端servlet的方法,并通过示例代码展示了前端JavaScript中的AJAX调用和后端servlet的接收处理。
这篇文章介绍了如何使用form表单结合Bootstrap格式将前端数据通过action属性提交到后端的servlet,包括前端表单的创建、数据的一级和二级验证,以及后端servlet的注解和参数获取。
|
1天前
|
前端开发 JavaScript
前端JS截取url上的参数
文章介绍了两种前端JS获取URL参数的方法:手动截取封装和使用URLSearchParams。
7 0
|
4月前
|
前端开发 BI
jeecgboot中前端使用带有参数报表的方法
jeecgboot中前端使用带有参数报表的方法
272 0
|
1月前
|
缓存 前端开发 Java
【Azure 应用服务】App Service 使用Tomcat运行Java应用,如何设置前端网页缓存的相应参数呢(-Xms512m -Xmx1204m)?
【Azure 应用服务】App Service 使用Tomcat运行Java应用,如何设置前端网页缓存的相应参数呢(-Xms512m -Xmx1204m)?
|
2月前
|
开发框架 前端开发 JavaScript
循序渐进VUE+Element 前端应用开发(33)--- 邮件参数配置和模板邮件发送处理
循序渐进VUE+Element 前端应用开发(33)--- 邮件参数配置和模板邮件发送处理
|
2月前
|
缓存 前端开发
网页设计,若依修改06(It must be done)-----前端post请求用data传参数
网页设计,若依修改06(It must be done)-----前端post请求用data传参数
|
3月前
|
前端开发 JavaScript
阿里云验证码2.0 验证时报错 前端页面获取的验证参数有问题,动态JS加载失败,请问怎么解决啊?急,急,急。
用户反馈校验时遇到错误,日志显示验证码参数获取异常。采用无痕验证,失败后,返回`{captchaResult:false,bizResult:false}`,未触发滑块二次验证。
|
10月前
|
前端开发
怎么查看前端表单提交到后台的所有参数
怎么查看前端表单提交到后台的所有参数
29 0