JavaScript中的函数定义

第8章 函数

在JS中函数即对象,程序可以随意操控他们。可以把函数赋值给变量,或者作为参数传递给其他函数。因为函数就是对象,所以可以给他们设置属性,甚至调用他们的方法。

JavaScript的函数可以嵌套在其他函数中定义,这样它们就可以访问它们被定义时所处的作用域中的任何变量,这意味着JavaScript函数构成了一个闭包closure,它给JS带来了非常强劲的编程能力。

8.1 函数定义

使用function关键字来定义,用在表达式或者函数声明语句两种形式。

都以function关键字开始,随后跟随以下组成部分:

  • 函数名称标识符,就像变量名称,新定义的函数对象会赋值给这个变量,对函数定义表达式来说,这个名字是可选的,如果存在,该名字只存在于函数体中,并指代该函数对象本身。
  • 一对圆括号,包含0个或多个用逗号隔开的标识符组成的列表,这些标识符是函数的参数名称,就像函数体中的局部变量一样。
  • 一对花括号,包含若干JS语句,构成了函数体,调用函数后就会执行这些语句。

8-1 定义JavaScript函数

<!DOCTYPE html>
<html><head><meta charset="utf-8"><title>8-1 定义JavaScript函数</title><script>//输出o的每个属性的名称和值,返回undefinedfunction printprops(o) {for (var p in o) {console.log(p + ":" + o[p] + "\n");}}//计算两个笛卡尔坐标(x1,y1)和(x2,y2)之间的距离function distance(x1, y1, x2, y2) {var dx = x2 - x1;var dy = y2 - y1;return Math.sqrt(Math.pow(dx, 2) + Math.pow(dy, 2));}//计算阶乘的递归函数(调用自身的函数)function factorial(x) {if (x <= 1) {return 1;}return x * factorial(x - 1)}//函数表达式定义了一个函数用来求传入参数的平方var square = function (x) {return x * x};//函数表达式可以包含名称,这在递归时很有用var f = function fact(x) {if (x <= 1) {return 1;} else {return x * fact(x - 1);}}//函数表达式也可以作为参数传给其他函数var data = [2, 1, 3, 5, 4, 7, 6, 8, 9]data.sort(function (a, b) {return a - b;});//函数表达式有时定义后立即调用,10为参数默认值var tensquared = (function (x) {return x * x;}(10));</script>
</head><body><h1>8-1 定义JavaScript函数</h1><textarea name="" id="" cols="80" rows="43" readonly><script>//输出o的每个属性的名称和值,返回undefinedfunction printprops(o) {for (var p in o) {console.log(p + ":" + o[p] + "\n");}}//计算两个笛卡尔坐标(x1,y1)和(x2,y2)之间的距离function distance(x1, y1, x2, y2) {var dx = x2 - x1;var dy = y2 - y1;return Math.sqrt(Math.pow(dx, 2) + Math.pow(dy, 2));}//计算阶乘的递归函数(调用自身的函数)function factorial(x) {if (x <= 1) {return 1;}return x * factorial(x - 1)}//函数表达式定义了一个函数用来求传入参数的平方var square = function (x) {return x * x};//函数表达式可以包含名称,这在递归时很有用var f = function fact(x) {if (x <= 1) {return 1;} else {return x * fact(x - 1);}}//函数表达式也可以作为参数传给其他函数var data = [2, 1, 3, 5, 4, 7, 6, 8, 9]data.sort(function (a, b) {return a - b;});//函数表达式有时定义后立即调用,10为参数默认值var tensquared = (function (x) {return x * x;}(10));</script></textarea>
</body></html>

注意:以表达式定义的函数,函数名是可选的,一条函数声明语句实际上声明了一个变量,并把函数对象赋值给它。相对而言,定义函数表达式时并没有声明一个变量。函数可以命名,就像上面的阶乘函数,它需要一个名字来指代自己。如果一个函数定义表达式包含名称,函数的局部作用域将会包含一个绑定到函数对象的名称,实际上函数的名称成为函数内部的一个局部变量。

通常来说以表达式方式定义函数时都不需要名称,这会让定义它们的代码更为紧凑。函数定义表达式特别适合用来定义那些只会用到一次的函数,比如上面展示的最后两个例子。

函数命名

合法的JS标识符都可以作为函数名称,尽量选择描述性强而又简洁的函数名。

通常以动词或动词为前缀的词组,第一个字符小写,多个单词时,一种是下划线隔开,就像like_this(),还有一种约定就是除了第一个单词之外首字母大写,也叫小驼峰命名法,就像likeThis()。有些函数用作内部函数或私有函数,通常以下划线为前缀。

一些编程风格和框架中,为调用函数指定短名字,例如jQuery就将最常用方法命名为$(),$和_是除了字母和数字外,两个合法的标识符。

函数声明语句会被提前到外部脚本或作用域的顶部,它之前定义的函数也可以调用它。但表达式定义的函数另当别论,调用它必须引用它,变量声明可以提前,但是赋值不能,因此,表达式定义之前的函数无法调用它。

函数有return返回对应内容,没有没人返回undefined,没有返回值的函数可以成为过程。

嵌套函数

JS中函数是可以嵌套在其他函数里的。

案例:

嵌套函数有趣之处在于它的变量作用域规则:他们可以访问嵌套它们的函数的参数和变量,上面代码中内部函数square()可以读写外部函数nest定义的参数a,b。作用域规则对内嵌函数非常重要。

函数声明语句,规范只允许它们出现在全局代码里,或者内嵌其他函数中,但不能出现在循环、条件判断、异常处理等语句中。

函数定义表达式可以出现在任何地方。

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

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

相关文章

Flux最新ControlNet 高清修复模型测评,效果好速度快!

上一篇介绍了Jasper AI 发布了三个模型中的法线贴图&#xff0c;没看过的可以看一下哈&#xff1a; Flux目前最快ControlNet模型现身&#xff01;法线贴图详细测评 (chinaz.com) 这次再介绍一下另一个模型&#xff1a;升频器&#xff0c;可以有比较好的模糊修复效果&#xff…

【数据结构】散列(哈希)表简单介绍

散列表也叫做哈希表&#xff08;Hash table&#xff09;&#xff0c;散列表通过关键码和存储地址建立唯一确定的映射关系&#xff0c;能够快速查找到对应的元素&#xff0c;排序算法中的计数排序就是一种利用哈希进行排序的算法。 一、散列表的概念 散列表&#xff08;Hash ta…

解决DHCP服务异常导致设备无法获取IP地址的方法

DHCP在网络环境中会自动为网络中的设备分配IP地址和其他关键网络参数&#xff0c;可以简化网络配置过程。但是&#xff0c;如果DHCP服务出现异常时&#xff0c;设备可能无法正常获取IP地址&#xff0c;会影响到网络通信。 本文讲述一些办法可以有效解决DHCP服务异常导致设备无法…

怎样在 Python 中创建一个自定义函数?

Python函数一般用来实现某个功能模块&#xff0c;可以反复使用&#xff0c;能极大的提升编程效率&#xff0c;多用函数也是写代码的好习惯。 Python中创建函数有两种方式&#xff0c;第一种使用def关键字创建自定义函数&#xff08;最常见的&#xff09;&#xff0c;第二种使用…

【前端】35道JavaScript进阶问题(1)

来源&#xff1a; javascript-questions/zh-CN/README-zh_CN.md at master lydiahallie/javascript-questions GitHub 记录一些有趣的题。 1 输出是&#xff1f; const shape {radius: 10,diameter() {return this.radius * 2},perimeter: () > 2 * Math.PI * this.rad…

Windows11系统下Docker环境搭建教程

目录 前言Docker简介安装docker总结 前言 本文为博主在项目环境搭建时记录的Docker安装流程&#xff0c;希望对大家能够有所帮助&#xff0c;不足之处欢迎批评指正&#x1f91d;&#x1f91d;&#x1f91d; Docker简介 Docker 就像一个“容器”平台&#xff0c;可以帮你把应用…

XPath入门

&#x1f4dd; 主旨内容 一、XPath语法 XPath 使用路径表达式来选取 XML 文档中的节点或节点集。节点是通过沿着路径 (path) 或者步 (steps) 来选取的。 (一)XML实例文档 我们将在下面的例子中使用这个 XML 文档。 实例 <?xml version"1.0" encoding"UT…

桥接模式和NET模式的区别

桥接模式和NET模式的区别 NAT模式&#xff1a; NAT&#xff1a;网络地址转换&#xff08;模式&#xff09;&#xff1a;借助宿主机来上网&#xff0c;没桥接那么麻烦&#xff0c;只用配置DNS即可。 缺点&#xff1a;扎根于宿主机&#xff0c;不能和局域网内其它真实的主机进行…

Commons-io工具包

FileUtils类&#xff08;文件/文件夹相关&#xff09; IOUtils类 Commons IO – 下载 Apache Commons IO 解压缩 将第一个jar包放入到项目的lib文件夹中 加入到项目之后&#xff0c;需要关联上&#xff0c;在关联上之后就可以打开看见里面写的文件了。

三篇文章速通JavaSE到SpringBoot框架 (中) IO 进程线程 网络编程 XML MySQL JDBC相关概念与演示代码

文章目录 IOfile类的作用I/O的作用将上篇文章综合项目使用IO流升级所需知识点 进程 线程创建线程的三种方式 网络编程网络编程介绍IP地址端口号网络通信协议网络通信协议的分层演示代码 XMLXML的作用是什么&#xff1f;xml特点 注解什么是注解&#xff1f;注解的使用注解的重要…

64.【C语言】再议结构体(下)

本文衔接第63篇63.【C语言】再议结构体(上) 目录 目录 6.复习 7.修改默认对齐数 8.结构体传参 01.传递非指针参数 02.传递指针参数(传递地址) 03.对比 9.结构体实现位段 01.位段的定义 02.格式 03.例题 答案速查 分析 10.位段跨平台问题 11.位段的应用 12.其他…

springboot+satoken实现刷新token(值变化)

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 &#x1f38f;&#xff1a;你只管努力&#xff0c;剩下的交给时间 &#x1f3e0; &#xff1a;小破站 springbootsatoken实现刷新token satoken是什么&#xff1f;支持什么&#xff1f;为什么需要&…

Word样式的同步与重置

有时候我们需要修改Word中的样式&#xff0c;实现排版的个性化。 如何同步样式到其他电脑上&#xff1f; Word中的样式是由Normal.dotm文件控制的&#xff0c;对样式所有的设置和修改&#xff0c;都会保存到这个问题件中&#xff0c;所以我们只需要在设置好样式以后&#xff…

springboot整合sentinel和对feign熔断降级

一、准备 docker安装好sentinel-dashboard&#xff08;sentinel控制台&#xff09;&#xff0c;参考docker安装好各个组件的命令启动sentinel-dashboard&#xff0c;我的虚拟机ip为192.168.200.131&#xff0c;sentinel-dashboard的端口为8858 二、整合sentinel的主要工作 在…

[Docker学习笔记]Docker的原理Docker常见命令

文章目录 什么是DockerDocker的优势Docker的原理Docker 的安装Docker 的 namespaces Docker的常见命令docker version:查看版本信息docker info 查看docker详细信息我们关注的信息 docker search:镜像搜索docker pull:镜像拉取到本地docker push:推送本地镜像到镜像仓库docker …

恋爱辅助应用小程序app开发之广告策略

恋爱话术小程序带流量主广告开启&#xff0c;是一个有效的盈利模式&#xff0c;可以增加小程序的收入来源。以下是对此的详细分析 一、流量主广告的定义与优势 流量主广告是指在小程序中嵌入广告位&#xff0c;通过展示广告内容来获取广告主的付费。对于恋爱话术小程序而言&am…

胤娲科技:AI界的超级充电宝——忆阻器如何让LLM告别电量焦虑

当AI遇上“记忆橡皮擦”&#xff0c;电量不再是问题&#xff01; 嘿&#xff0c;朋友们&#xff0c;你们是否曾经因为手机电量不足而焦虑得像个无头苍蝇&#xff1f;想象一下&#xff0c;如果这种“电量焦虑”也蔓延到了AI界&#xff0c; 特别是那些聪明绝顶但“耗电如喝水”的…

yolov8环境安装

yolov8 git地址 https://github.com/ultralytics/ultralytics/tree/main 我的电脑显卡配置 nvidia-smi cuda11.8下载 https://developer.nvidia.com/cuda-11-8-0-download-archive?target_osWindows&target_archx86_64&target_version10&target_typeexe_local …

Arthas perfcounter(查看当前 JVM 的 Perf Counter 信息)

文章目录 二、命令列表2.1 jvm相关命令2.1.13 perfcounter&#xff08;查看当前 JVM 的 Perf Counter 信息&#xff09;举例1&#xff1a;查看当前 JVM 的 Perf Counter 信息举例2&#xff1a;可以用-d参数打印更多信息 本人其他相关文章链接 二、命令列表 2.1 jvm相关命令 2…

ArcGIS与ArcGIS Pro去除在线地图服务名单

我们之前给大家分享了很多在线地图集&#xff0c;有些地图集会带有制作者信息&#xff0c;在布局制图的时候会带上信息影响出图美观。 一套GIS图源集搞定&#xff01;清新规划底图、影像图、境界、海洋、地形阴影图、导航图 比如ArcGIS&#xff1a; 比如ArcGIS Pro&#xff1a…