python函数定义和调用_函数定义和调用

定义函数

在JavaScript中,定义函数的方式如下:

function abs(x) {

if (x >= 0) {

return x;

} else {

return -x;

}

}

上述abs()函数的定义如下:

function指出这是一个函数定义;

abs是函数的名称;

(x)括号内列出函数的参数,多个参数以,分隔;

{ ... }之间的代码是函数体,可以包含若干语句,甚至可以没有任何语句。

请注意,函数体内部的语句在执行时,一旦执行到return时,函数就执行完毕,并将结果返回。因此,函数内部通过条件判断和循环可以实现非常复杂的逻辑。

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

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

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

var abs = function (x) {

if (x >= 0) {

return x;

} else {

return -x;

}

};

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

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

调用函数

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

abs(10); // 返回10

abs(-9); // 返回9

由于JavaScript允许传入任意个参数而不影响调用,因此传入的参数比定义的参数多也没有问题,虽然函数内部并不需要这些参数:

abs(10, 'blablabla'); // 返回10

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

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

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;

}

}

arguments

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

'use strict'

----

function foo(x) {

console.log('x = ' + x); // 10

for (var i=0; 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最常用于判断传入参数的个数。你可能会看到这样的写法:

// foo(a[, b], c)

// 接收2~3个参数,b是可选参数,如果只传2个参数,b默认为null:

function foo(a, b, c) {

if (arguments.length === 2) {

// 实际拿到的参数是a和b,c为undefined

c = b; // 把b赋给c

b = null; // b变为默认值

}

// ...

}

要把中间的参数b变为“可选”参数,就只能通过arguments判断,然后重新调整参数并赋值。

rest参数

由于JavaScript函数允许接收任意个参数,于是我们就不得不用arguments来获取所有参数:

function foo(a, b) {

var i, rest = [];

if (arguments.length > 2) {

for (i = 2; i

rest.push(arguments[i]);

}

}

console.log('a = ' + a);

console.log('b = ' + b);

console.log(rest);

}

为了获取除了已定义参数a、b之外的参数,我们不得不用arguments,并且循环要从索引2开始以便排除前两个参数,这种写法很别扭,只是为了获得额外的rest参数,有没有更好的方法?

ES6标准引入了rest参数,上面的函数可以改写为:

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)。

因为rest参数是ES6新标准,所以你需要测试一下浏览器是否支持。请用rest参数编写一个sum()函数,接收任意个参数并返回它们的和:

'use strict';

----

function sum(...rest) {

???

}

----

// 测试:

var i, args = [];

for (i=1; i<=100; i++) {

args.push(i);

}

if (sum() !== 0) {

console.log('测试失败: sum() = ' + sum());

} else if (sum(1) !== 1) {

console.log('测试失败: sum(1) = ' + sum(1));

} else if (sum(2, 3) !== 5) {

console.log('测试失败: sum(2, 3) = ' + sum(2, 3));

} else if (sum.apply(null, args) !== 5050) {

console.log('测试失败: sum(1, 2, 3, ..., 100) = ' + sum.apply(null, args));

} else {

console.log('测试通过!');

}

小心你的return语句

前面我们讲到了JavaScript引擎有一个在行末自动添加分号的机制,这可能让你栽到return语句的一个大坑:

function foo() {

return { name: 'foo' };

}

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

如果把return语句拆成两行:

function foo() {

return

{ name: 'foo' };

}

foo(); // undefined

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

function foo() {

return; // 自动添加了分号,相当于return undefined;

{ name: 'foo' }; // 这行语句已经没法执行到了

}

所以正确的多行写法是:

function foo() {

return { // 这里不会自动加分号,因为{表示语句尚未结束

name: 'foo'

};

}

练习

定义一个计算圆面积的函数area_of_circle(),它有两个参数:

r: 表示圆的半径;

pi: 表示π的值,如果不传,则默认3.14

'use strict';

function area_of_circle(r, pi) {

----

return 0;

----

}

// 测试:

if (area_of_circle(2) === 12.56 && area_of_circle(2, 3.1416) === 12.5664) {

console.log('测试通过');

} else {

console.log('测试失败');

}

小明是一个JavaScript新手,他写了一个max()函数,返回两个数中较大的那个:

'use strict';

function max(a, b) {

----

if (a > b) {

return

a;

} else {

return

b;

}

----

}

console.log(max(15, 20));

但是小明抱怨他的浏览器出问题了,无论传入什么数,max()函数总是返回undefined。请帮他指出问题并修复。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/504343.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python文件是怎么写_python头文件怎么写

本文主要以python2为例。首先介绍一下Python头文件的编程风格&#xff0c;然后再给大家详细介绍import部分的基本用法。这两个部分就是Python中头文件的组成模块。编程风格#!/usr/bin/env python #在文件头部 ( 第一行 ) 加上 设置 Python 解释器 # -*- coding: utf-8 -*- #在文…

【学习笔记】第二章——处理机调度的概念、层次、时机、切换过程 调度方式、调度算法的指标

文章目录一. 概念 & 层次1. 高级调度&#xff08;作业调度&#xff09;2. 中级调度&#xff08;内存调度&#xff09;挂起态 & 七状态模型3. 低级调度&#xff08;进程调度&#xff09;4. 三种调度的对比联系 && 总结二. 时机、切换过程 & 调度方式1. 进程…

formdata上传文件_关于multipart/formdata上传文件

最近在做一个文件上传的开放接口&#xff0c;用到Content-Type: multipart/form-data这种请求类型&#xff0c;特地做了一些研究和记录。在最初的 http协议中&#xff0c;并没有上传文件方面的功能。RFC1867为 http协议添加了这个能力。常见的浏览器&#xff0c;如 Microsoft I…

【学习笔记】第二章——调度算法:先来先服务FCFS、短作业优先SJF、高响应比HRRN

文章目录一. 先来先服务&#xff08;FCFS&#xff09;二. 短作业优先&#xff08;SJF&#xff09;三. 高响应比优先1. 对前面两种算法的思考2. 描述四. 一、二、三总结例子都要手动写一遍哦&#xff5e;这三个是供早期的批处理系统使用的算法 一. 先来先服务&#xff08;FCFS&a…

python 最短路径算法_python Dijkstra算法实现最短路径问题的方法

本文借鉴于张广河教授主编的《数据结构》&#xff0c;对其中的代码进行了完善。 从某源点到其余各顶点的最短路径 Dijkstra算法可用于求解图中某源点到其余各顶点的最短路径。假设G&#xff5b;V&#xff0c;&#xff5b;E&#xff5d;&#xff5d;是含有n个顶点的有向图&#…

【学习笔记】第二章——时间片轮转RR、优先级调度、多级反馈队列调度算法

文章目录一. 时间片轮转二. 优先级调度三. 多级反馈队列调度算法四. 总结一. 时间片轮转 公平&#xff0c;轮流给进程提供时间片只用于进程调度&#xff08;只有进程才能被分配时间片&#xff09;抢占式&#xff0c;由时钟装置发出时钟中断来通知**缺点&#xff1a;**高频的进…

laravel 分词搜索匹配度_elasticsearch基础笔记9-elasticsearch 词项全文搜索

es的核心功能就是搜索和分析。那么我们看看搜索相关内容1、搜索机制在进入搜索之前&#xff0c;会对查询体根据情况进行分析和处理。2、有哪些常用搜索类型全文查询 词项查询 复合查询 嵌套查询 位置查询 特殊查询等。我们常用到的就是前三种&#xff0c;学起来简单&#xff0c…

【学习笔记】第二章——进程同步、进程互斥、进程互斥的硬件/软件实现方法

文章目录一. 进程同步 && 进程互斥四个区域四个原则总结&#xff1a;二. 进程互斥的软件实现方法1&#xff09;单标志法2&#xff09;双标志先检查法3&#xff09;双标志后检查法4&#xff09;Peterson 算法总结三. 进程互斥的硬件实现方法1&#xff09;中断屏蔽方法2&…

python的数据结构包括那些_python算法与数据结构-什么是数据结构

一、什么是数据结构 数据结构&#xff0c;直白地理解&#xff0c;就是研究数据的存储方式。 我们知道&#xff0c;数据存储只有一个目的&#xff0c;即为了方便后期对数据的再利用&#xff0c;就如同我们使用数组存储 {1,2,3,4,5} 是为了后期取得它们的值&#xff0c;因此&…

【学习笔记】MOOC 数学文化赏析 笔记

文章目录一. 笔记1&#xff09;各种知识点2&#xff09;数集3&#xff09;几何4&#xff09;幻方5&#xff09;难题、猜想与定理二. 典中典题目&#xff1a;临时学习整理&#xff0c;欢迎各位大佬留言补充&#xff5e;&#xff08;比如数集、幻方等部分比较贫瘠 &#xff09; 一…

seo自动发外链_一套节约成本全网营销方案-小小课堂SEO培训教程

很多公司都是由一些小型工作室或个人工作室慢慢发展而来的&#xff0c;在这过程中&#xff0c;人员、资金链、资源、项目等因素一旦出现问题&#xff0c;可能会导致项目失败&#xff0c;那么在互联网上投入的资金如果过多&#xff0c;可能都是白白打了水漂。今天&#xff0c;小…

【学习笔记】MOOC 数学文化赏析 笔记【补档】

文章目录一. 笔记1&#xff09;各种知识点2&#xff09;数集3&#xff09;几何4&#xff09;幻方5&#xff09;难题、猜想与定理二. 典中典题目&#xff1a;临时学习整理&#xff0c;欢迎各位大佬留言补充&#xff5e;&#xff08;比如数集、幻方等部分比较贫瘠 &#xff09; 一…

python 支付宝个人账单_金融支付财务融合业务-实践分享1:订单、账单、交易流水、账套知识解构、原理解析...

本文作者从实际工作实践出发&#xff0c;结合案例等分享了电商金融支付财务融合中的基本概念和相关原理解析&#xff0c;包括&#xff1a;订单、账单、交易流水和账知识解构&#xff0c;供大家一同参考和学习。从事电商、进销存、金融、支付、财务的产品同学&#xff0c;是否对…

【学习笔记】第二章——信号量机制 用信号量实现互斥、同步

文章目录一. 信号量机制整型信号量记录型信号量例子&#xff1a;总结二. 用信号量实现互斥、同步互斥同步前驱总结一. 信号量机制 信号量&#xff1a;一个用于表示系统中某种资源的数量的变量&#xff08;整数 or 记录型变量&#xff09;一对原语&#xff1a;wait(S) 和 signa…

opengl 安装_一步步学OpenGL(34) -《GLFX,一个OpenGL效果库》

教程 34GLFX,一个OpenGL效果库原文&#xff1a; http://ogldev.atspace.co.uk/www/tutorial34/tutorial34.htmlCSDN完整版专栏&#xff1a; https://blog.csdn.net/cordova/article/category/9266966理论介绍这篇教程暂时先不继续探索OpenGL的特性和3D技术了&#xff0c;来介绍…

【LeetCode笔记】剑指 Offer 60. n个骰子的点数(Java、动态规划)

文章目录题目描述代码 & 思路1. 二维数组&#xff08;方便理解&#xff09;2. 一维数组&#xff08;节约空间&#xff09;二刷鸽了好久的打题博客&#xff5e;要继续补起来了&#xff01; 今天不打题&#xff0c;明天变垃圾 QAQ 题目描述 一眼就想先暴力枚举、或者递归呀&…

python2和3_python2和python3的区别

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼1.字符串类型python中有两种字符类型&#xff1a;字节字符串和文本字符串。版本python2python3字节字符串strbytes文本字符串Unicodestr2.默认字符python2中默认的字符串类型默认是ASCII&#xff0c;python3中默认的字符串类型是Un…

java 根据圆心计算圆弧上点的经纬度_【控制测量学】-高斯投影正算公式以及java代码

正算公式(将经纬度转化为坐标):java代码(附有源代码和修改后的代码):源代码:/** * 由经纬度反算成高斯投影坐标 * * param longitude * param latitude * return */ public static double[] GaussToBLToGauss( double longitude, double latitude) { …

【LeetCode笔记】剑指 Offer 59 - II. 队列的最大值(Java、辅助队列)

文章目录题目描述思路 && 代码二刷题目描述 恢复打题的第二天打卡&#xff5e; 可以说是这道最小栈的兄弟题目了&#xff0c;很相似总体思路还是一样&#xff0c;靠空间换时间&#xff5e;也就是借助辅助队列 思路 && 代码 这篇题解的动图做得很好&#xff…

redis setnx原子性_不支持原子性的 Redis 事务也叫事务吗?

文章收录在 GitHub JavaKeeper &#xff0c;N线互联网开发必备技能兵器谱 假设现在有这样一个业务&#xff0c;用户获取的某些数据来自第三方接口信息&#xff0c;为避免频繁请求第三方接口&#xff0c;我们往往会加一层缓存&#xff0c;缓存肯定要有时效性&#xff0c;假设我们…