前端基础(十一)_函数声明及调用、函数的形参与实参、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();
目录
相关文章
|
1月前
|
JSON 前端开发 JavaScript
聊聊 Go 语言中的 JSON 序列化与 js 前端交互类型失真问题
在Web开发中,后端与前端的数据交换常使用JSON格式,但JavaScript的数字类型仅能安全处理-2^53到2^53间的整数,超出此范围会导致精度丢失。本文通过Go语言的`encoding/json`包,介绍如何通过将大整数以字符串形式序列化和反序列化,有效解决这一问题,确保前后端数据交换的准确性。
36 4
|
2月前
|
前端开发 JavaScript
前端:实现一个 sleep 函数
在前端开发中,实现一个 `sleep` 函数可以用来暂停代码执行,模拟延迟效果,常用于测试或控制异步操作的节奏。该函数通常基于 `Promise` 和 `setTimeout` 实现,简单易用。
|
2月前
|
机器学习/深度学习 弹性计算 自然语言处理
前端大模型应用笔记(二):最新llama3.2小参数版本1B的古董机测试 - 支持128K上下文,表现优异,和移动端更配
llama3.1支持128K上下文,6万字+输入,适用于多种场景。模型能力超出预期,但处理中文时需加中英翻译。测试显示,其英文支持较好,中文则需改进。llama3.2 1B参数量小,适合移动端和资源受限环境,可在阿里云2vCPU和4G ECS上运行。
127 1
|
3月前
|
存储 前端开发 JavaScript
前端基础(十二)_函数高级、全局变量和局部变量、 预解析(变量提升)、函数返回值
本文介绍了JavaScript中作用域的概念,包括全局变量和局部变量的区别,预解析机制(变量提升),以及函数返回值的使用和类型。通过具体示例讲解了变量的作用域、函数的返回值、以及如何通过return关键字从函数中返回数据。
24 1
前端基础(十二)_函数高级、全局变量和局部变量、 预解析(变量提升)、函数返回值
|
2月前
|
JSON 前端开发 数据格式
@RequestMapping运用举例(有源码) 前后端如何传递参数?后端如何接收前端传过来的参数,传递单个参数,多个参数,对象,数组/集合(有源码)
文章详细讲解了在SpringMVC中如何使用`@RequestMapping`进行路由映射,并介绍了前后端参数传递的多种方式,包括传递单个参数、多个参数、对象、数组、集合以及JSON数据,并且涵盖了参数重命名和从URL中获取参数的方法。
205 0
@RequestMapping运用举例(有源码) 前后端如何传递参数?后端如何接收前端传过来的参数,传递单个参数,多个参数,对象,数组/集合(有源码)
|
3月前
|
前端开发 小程序 开发者
小程序的前端 display 有什么类型?
【9月更文挑战第4天】小程序的前端 display 有什么类型?
81 4
|
3月前
|
前端开发 JavaScript
前端JS截取url上的参数
文章介绍了两种前端JS获取URL参数的方法:手动截取封装和使用URLSearchParams。
60 0
|
2月前
|
存储 人工智能 前端开发
前端大模型应用笔记(三):Vue3+Antdv+transformers+本地模型实现浏览器端侧增强搜索
本文介绍了一个纯前端实现的增强列表搜索应用,通过使用Transformer模型,实现了更智能的搜索功能,如使用“番茄”可以搜索到“西红柿”。项目基于Vue3和Ant Design Vue,使用了Xenova的bge-base-zh-v1.5模型。文章详细介绍了从环境搭建、数据准备到具体实现的全过程,并展示了实际效果和待改进点。
183 2
|
2月前
|
JavaScript 前端开发 程序员
前端学习笔记——node.js
前端学习笔记——node.js
49 0
|
2月前
|
人工智能 自然语言处理 运维
前端大模型应用笔记(一):两个指令反过来说大模型就理解不了啦?或许该让第三者插足啦 -通过引入中间LLM预处理用户输入以提高多任务处理能力
本文探讨了在多任务处理场景下,自然语言指令解析的困境及解决方案。通过增加一个LLM解析层,将复杂的指令拆解为多个明确的步骤,明确操作类型与对象识别,处理任务依赖关系,并将自然语言转化为具体的工具命令,从而提高指令解析的准确性和执行效率。
下一篇
DataWorks