JS-10-函数

news/2024/11/29 7:37:53/

一、函数的定义

function 函数名(参数列表)
{// 函数体
}

示例:

function abs(x) {if (x >= 0) {return x;} else {return -x;}
}

请注意,函数体内部的语句在执行时,一旦执行到return时,函数就执行完毕,并将结果返回

如果没有return语句,函数执行完毕后也会返回结果,只是结果为undefined。

由于JavaScript的函数也是一个对象,上述定义的abs()函数实际上是一个函数对象,而函数名abs可以视为指向该函数的变量。

因此,第二种定义函数的方式如下:

var 变量名 = function (参数列表)
{// 函数体
};

示例:

var abs = function (x) {if (x >= 0) {return x;} else {return -x;}
};

在这种方式下,function (x) { ... }是一个匿名函数,它没有函数名。但是,这个匿名函数赋值给了变量abs,所以,通过变量abs就可以调用该函数。

上述两种定义完全等价,注意第二种方式按照完整语法需要在函数体末尾加一个;,表示赋值语句结束。

二、函数的调用

调用函数时,按顺序传入参数即可:

abs(10); // 返回10
abs(-9); // 返回9

1、传入的参数比定义的参数多也没有问题

abs(10, 'blablabla'); // 返回10
abs(-9, 'haha', 'hehe', null); // 返回9

2、传入的参数比定义的少也没有问题:

abs(); // 返回NaN

此时abs(x)函数的参数x将收到undefined,计算结果为NaN。

要避免收到undefined,可以对参数进行检查:

function abs(x) {if (typeof x !== 'number') {throw 'Not a number';}if (x >= 0) {return x;} else {return -x;}
}

JavaScript函数允许接收任意个参数

三、arguments关键字

JavaScript还有一个免费赠送的关键字arguments,它只在函数内部起作用,并且永远指向当前函数的调用者传入的所有参数。arguments类似Array但它不是一个Array:

function foo(x) {console.log('x = ' + x); // 10for (var i=0; i<arguments.length; i++) {console.log('arg ' + i + ' = ' + arguments[i]); // 10, 20, 30}
}
foo(10, 20, 30);

arguments关键字可以拿到调用者传入的所有参数!即使函数不定义任何参数,还是可以拿到参数的值:

function abs() {if (arguments.length === 0) {return 0;}var x = arguments[0];return x >= 0 ? x : -x;
}abs(); // 0
abs(10); // 10
abs(-9); // 9

实际上arguments最常用于判断传入参数的个数。

四、rest参数 

为了获取除了已定义参数a、b之外的参数,我们不得不用arguments,并且循环要从索引2开始以便排除前两个参数:

function foo(a, b) {var i, rest = [];if (arguments.length > 2) {for (i = 2; i<arguments.length; i++) {rest.push(arguments[i]);}}console.log('a = ' + a);console.log('b = ' + b);console.log(rest);
}

写法变扭,不方便,使用ES6标准引入的rest参数。因此,rest参数的目的:获取function中调用者传入的额外的参数。

function foo(a, b, ...rest) {console.log('a = ' + a);console.log('b = ' + b);console.log(rest);
}foo(1, 2, 3, 4, 5);
// 结果:
// a = 1
// b = 2
// Array [ 3, 4, 5 ]foo(1);
// 结果:
// a = 1
// b = undefined
// Array []

rest参数只能写在最后,前面用...标识

从运行结果可知,传入的参数先绑定a、b,多余的参数以数组形式交给变量rest,所以,不再需要arguments我们就获取了全部参数。

如果传入的参数连正常定义的参数都没填满,也不要紧,rest参数会接收一个空数组(注意不是undefined)。

四、return语句

JavaScript引擎有一个在行末自动添加分号的机制,所以,存在如下问题:

正确写法:

function foo() {return { name: 'foo' };
}foo(); // { name: 'foo' }

错误写法:

function foo() {return{ name: 'foo' };
}foo(); // undefined

要小心了,由于JavaScript引擎在行末自动添加分号的机制,上面的代码实际上变成了:

function foo() {return; // 自动添加了分号,相当于return undefined;{ name: 'foo' }; // 这行语句已经没法执行到了
}

所以正确的多行写法是:

function foo() {return { // 这里不会自动加分号,因为{表示语句尚未结束name: 'foo'};
}

http://www.ppmy.cn/news/1379673.html

相关文章

Python 学习——Python BeautifulSoup 库文档

目录 一、 Beautiful Soup 4.4.0 文档1.1 寻求帮助 二、 快速开始三、 安装 Beautiful Soup3.1 安装完成后的问题3.2 安装解析器 四、 如何使用五、 对象的种类5.1 Tag5.1.1 Name5.1.2 Attributes5.1.3 多值属性 5.2 可以遍历的字符串5.3 BeautifulSoup5.4 注释及特殊字符串 六…

计网《一》|互联网结构发展史|标准化工作|互联网组成|性能指标|计算机网络体系结构

计网《一》| 概述 计算机网络在信息时代的作用为什么说互联网是自印刷术以来人类在存储和交换领域的最大变革&#xff1f; 什么是互联网呢&#xff1f;互联网有什么用呢&#xff1f;为什么互联网能为用户提供许多服务 互联网基础结构发展的三个阶段第一个阶段&#xff1a;第二阶…

JMM(Java Memory Model)内存模型

Java内存模型&#xff0c;规范了计算机内存与java虚拟机之间的协调工作&#xff0c;即规定了 将java 虚拟机中的变量存储到内存中和从内从中取出来的内存细节。 Java内存模型中规定了所有的变量都存储在内存中&#xff0c;每条线程还有自己的工作内存&#xff0c;线程对变量的…

《C++游戏编程入门》第1章 类型、变量与标准I/O: Lost Fortune

《C游戏编程入门》第1章 类型、变量与标准I/O: Lost Fortune 1.1.1 使用C编写游戏1.1.2 生成可执行文件1.1.3 错误处理 1.2 第一个C程序01.game_over.cpp01.game_over2.cpp01.game_over3.cpp 1.4 使用算术运算符01.expensive_calculator.cpp 1.5 声明和初始化变量01.game_stats…

探索容器技术的世界:从 Docker 到 Podman,从 Kubernetes 到生态发展

随着云计算和微服务架构的兴起&#xff0c;容器技术在近年来迅速发展。Docker 是最早引领容器技术革命的先驱&#xff0c;但随着市场的变化和需求的不断演变&#xff0c;一些新的容器技术也开始崭露头角&#xff0c;例如 Podman。同时&#xff0c;容器编排工具 Kubernetes 也在…

20240309web前端_第一周作业_古诗词

作业三&#xff1a;古诗词 成果展示&#xff1a; 完整代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0&q…

udp通信程序(桥接模式)

发送端 #include "head.h"int sockfd 0; pthread_t tid_send; pthread_t tid_recv; struct sockaddr_in recvaddr ; char name[32];void *sendfun(void *arg) {struct msgbuf sendmsg;ssize_t nsize 0;while(1){memset(&sendmsg,0,sizeof(sendmsg));sendmsg.…

C43500 CuZn19Sn铜合金品质保证

C43500 CuZn19Sn铜合金品质保证 80年代以来&#xff0c;由于光纤电缆载流容量大等优点&#xff0c;在通讯干线上不断取代铜电缆&#xff0c;而迅速推广应用。但是&#xff0c;把电能转化为光能&#xff0c;以及输入用户的线路仍需使用大量的铜。随着通讯事业的发展&#xff0c;…