JavaScript基础5——关于ECMAscript的函数

  • ECMAScript的函数概述(一般定义到<head>标签之间)

(1)定义函数,JavaScript一般有三种定义函数方法:
*第一种是使用function语句定义函数(静态方法)

1 function 函数名(var1,var2,...,varX)
2      {
3 
4          代码...(return)
5 
6      }


第二种是使用Function()构造函数来定义函数(不常用)

1 var 函数名 = new Function(“参数1”,”参数2”,”参数3”……”函数体”);
2 如:
3 var 函数名 = new Function(”x”,”y”,”var z=x+y;return z;”);

 
*第三种是在表达式中定义函数

1 var 函数名 = function(参数1,参数2,…){函数体};
2 //例如:
3 //定义
4 var add = function(a,b){
5 return a+b;
6 }
7 //调用函数
8 document.write(add(50,20));

 

(2)函数作用域:

       函数外面定义的变量是全局变量,在整个HTML页面内都有效(生存期在整个HTML页面)。,函数内可以直接使用。在函数内部没有使用var定义的,变量则为全局变量,*在函数内使用var关键字定义的变量是局部变量,即出了函数外边无法获取。js函数定义的参数没有默认值。(目前只有最新的火狐浏览器支持)

 

(3)如何调用函数:

//sayHi函数
function sayHi(sName, sMessage) {alert("Hello " + sName + sMessage);}//调用上面的函数 sayHi(),会生成一个警告窗口
sayHi("David", " Nice to meet you!")

 

(4)函数如何返回值:

函数 sayHi() 未返回值,即使函数确实有值,也不必明确地声明它。该函数只需要使用 return 运算符后跟要返回的值即可。

 1 function sum(iNum1, iNum2) {
 2 
 3   return iNum1 + iNum2;
 4 
 5 }
 6 
 7 //下面的代码把 sum 函数返回的值赋予一个变量:
 8 
 9 var iResult = sum(1,1);
10 
11 alert(iResult);    //输出 "2"

另一个重要概念是,与在 Java 中一样,函数在执行过 return 语句后立即停止代码。因此,return 语句后的代码都不会被执行。

1 function sum(iNum1, iNum2) {
2 
3   return iNum1 + iNum2;
4 //alert 窗口就不会显示出来
5   alert(iNum1 + iNum2);
6 
7 }

一个函数中可以有多个 return 语句,如下所示:

 1 function diff(iNum1, iNum2) {
 2 
 3   if (iNum1 > iNum2) {
 4 
 5     return iNum1 - iNum2;
 6 
 7   } else {
 8 
 9     return iNum2 - iNum1;
10 
11   }
12 
13 }

上面的函数用于返回两个数的差。要实现这一点,必须用较大的数减去较小的数,因此用 if 语句决定执行哪个 return 语句。

如果函数无返回值,那么可以调用没有参数的 return 运算符,随时退出函数。

 1 function sayHi(sMessage) {
 2   if (sMessage == "bye") {
 3 
 4     return;
 5 
 6   }
 7 
 8   alert(sMessage);
 9 
10 }
11 //这段代码中,如果 sMessage 等于 "bye",就永远不显示警告框
12 
13 //注释:如果函数无明确的返回值,或调用了没有参数的 return 语句,那么它真正返回的值是 undefined。

 

  • 关于函数的arguments对象

在函数代码中,使用特殊对象 arguments,开发者无需明确指出参数名,就能访问它们。

例如,在函数 sayHi() 中,第一个参数是 message。用 arguments[0] 也可以访问这个值,即第一个参数的值(第一个参数位于位置 0,第二个参数位于位置 1,依此类推)。

因此,无需明确命名参数,就可以重写函数:

1 function sayHi() {
2   if (arguments[0] == "bye") {
3     return;
4   }
5   alert(arguments[0]);
6 }

1.检测参数个数

        还可以用 arguments 对象检测函数的参数个数,引用属性 arguments.length 即可。下面的代码将输出每次调用函数使用的参数个数:

 1 function howManyArgs() {
 2 
 3 alert(arguments.length);
 4 
 5 }
 6 
 7 howManyArgs("string", 45);
 8 howManyArgs();
 9 howManyArgs(12);
10 
11 //上面这段代码将依次显示 "2"、"0" 和 "1"。
12 //与其他程序设计语言不同,ECMAScript 不会验证传递给函数的参数个数是否等于函数定义的参数个数。开发者定义的函数都可以接受任意个数的参数(根据 Netscape 的文档,最多可接受 25 个),而不会引发任何错误。任何遗漏的参数都会以 undefined 传递给函数,多余的函数将忽略。

 

2.模拟函数重载

用 arguments 对象判断传递给函数的参数个数,即可模拟函数重载:

 1 function doAdd() {
 2 
 3   if(arguments.length == 1) {
 4 
 5     alert(arguments[0] + 5);
 6 
 7   } else if(arguments.length == 2) {
 8 
 9     alert(arguments[0] + arguments[1]);
10 
11   }
12 }
13 doAdd(10);    //输出 "15"
14 
15 doAdd(40, 20);    //输出 "60"
16 
17 //当只有一个参数时,doAdd() 函数给参数加 5。如果有两个参数,则会把两个参数相加,返回它们的和。所以,doAdd(10) 输出的是 "15",而 doAdd(40, 20) 输出的是 "60"。虽然不如重载那么好,不过已足以避开 ECMAScript 的这种限制。
  • Function对象(类)

1. Function对象的使用

函数实际上是功能完整的对象。Function 类可以表示开发者定义的任何函数。用 Function 类直接创建函数的语法如下:var function_name = new function(arg1, arg2, ..., argN, function_body)。

 1 <html>
 2 
 3 <head>
 4 
 5 <script type="text/javascript">
 6 
 7      var sayHi = new Function("sName", "sMessage", "alert(\"Hello \" + sName + sMessage);");
 8 
 9 </script>
10 
11 </head>
12 
13 
14 <body>
15 
16 <script type="text/javascript" >
17 
18      sayHi("Jackie","Welcome here!");//调用函数
19 
20 </script>
21 
22 </body>
23 
24 </html>

尽管可以使用 Function 构造函数创建函数,但最好不要使用它,因为用它定义函数比用传统方式要慢得多。不过,所有函数都应看作 Function 类的实例。

2. 使用Function类的length属性

 1 <html>
 2 
 3 <head>
 4 
 5 <script type="text/javascript">
 6 
 7      function fun1(){}
 8 
 9      function fun2(a1,a2){}
10 
11      function fun3(a1,a2,a3,a4,a5,a6,a7){}
12 
13 </script>
14 
15 </head>
16 
17  
18 <body>
19 
20 <script type="text/javascript">
21 
22      document.write(fun1.length+" "+fun2.length+" "+fun3.length);
23 
24 </script>
25 
26 </body>
27 
28 </html>

使用Function的length属性可以得到函数的形参个数。

3. 使用Function类的valueOf()方法和toString()方法。这两个方法返回的都是函数的源代码,在调试时尤其有用。

 

 1 <html>
 2 
 3 <head>
 4 
 5 function fun() {
 6 
 7   alert("Hi");
 8 
 9 }
10 
11 </head>
12 
13 <body>
14 
15 <script type="text/javascript">
16 
17      document.write(fun.toString());//输出函数的源代码
18 
19 </script>
20 
21 </body>
22 
23 </html>
  • 闭包

ECMAScript 最易让人误解的一点是,它支持闭包(closure)。闭包,指的是词法表示包括不被计算的变量的函数,也就是说,函数可以使用函数之外定义的变量。

1.简单的闭包实例

在 ECMAScript 中使用全局变量是一个简单的闭包实例。请思考下面这段代码:

 

1 var sMessage = "hello world"; 
2 
3 function sayHelloWorld() {
4 
5  alert(sMessage);//使用函数之外定义的变量
6 
7  } 
8 
9 sayHelloWorld(); 

 

在上面这段代码中,脚本被载入内存后,并没有为函数 sayHelloWorld() 计算变量 sMessage 的值。该函数捕获 sMessage 的值只是为了以后的使用,也就是说,解释程序知道在调用该函数时要检查 sMessage 的值。sMessage 将在函数调用 sayHelloWorld() 时(最后一行)被赋值,显示消息 "hello world"。

2.复杂的闭包实例

在一个函数中定义另一个会使闭包变得更加复杂。例如:

 

 1 var iBaseNum = 10; 
 2 
 3 function addNum(iNum1, iNum2) {
 4  
 5     function doAdd() { 
 6 
 7           return iNum1 + iNum2 + iBaseNum; 
 8 
 9      } 
10 
11     return doAdd();
12  
13 } 

 

这里,函数 addNum() 包括函数 doAdd() (闭包)。内部函数是一个闭包,因为它将获取外部函数的参数 iNum1 和 iNum2 以及全局变量 iBaseNum 的值。 addNum() 的最后一步调用了 doAdd(),把两个参数和全局变量相加,并返回它们的和。

这里要掌握的重要概念是,doAdd() 函数根本不接受参数,它使用的值是从执行环境中获取的。可以看到,闭包是 ECMAScript 中非常强大多用的一部分,可用于执行复杂的计算。

提示:就像使用任何高级函数一样,使用闭包要小心,因为它们可能会变得非常复杂。

  • JavaScript函数的思维导图

转载于:https://www.cnblogs.com/Jackie0714/p/4944041.html

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

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

相关文章

中国科学家首次观察到量子世界的宇称时间对称

来源&#xff1a;中国新闻网 中国科学家调控量子跳双人舞 首次观察到量子世界的宇称时间对称中新社合肥6月3日电 (吴兰 范琼)记者3日从中国科学技术大学获悉&#xff0c;该校杜江峰院士的研究团队通过调控量子跳出双人舞&#xff0c;在国际上首次观察到量子世界的宇称时间对称。…

OpenCV与图像处理学习三——线段、矩形、圆、椭圆、多边形的绘制以及文字的添加

OpenCV与图像处理学习三——线段、矩形、圆、椭圆、多边形的绘制以及文字的添加一、OpenCV中的绘图函数1.1 线段绘制1.2 矩形绘制1.3 圆绘制1.4 椭圆的绘制1.5 多边形绘制1.6 添加文字上两次笔记主要知识点回顾&#xff1a; 数字图像基本概念图像的读取、显示与保存图像直方图…

AI英雄 | 论人工智能与自由意志,请看尤瓦尔与李飞飞的这场“激辩”

来源&#xff1a;Towards Data Science尤瓦尔赫拉利和李飞飞在斯坦福大学展开了一场别开生面的对话&#xff0c;他们所提出的问题已经远远超出了我们可以解答的范围。《连线》杂志主编尼古拉斯•汤普森在座无虚席的纪念礼堂主持了这场90分钟的谈话。赫拉利&#xff08;Harari&a…

OpenCV与图像处理学习四——图像几何变换:平移、缩放、旋转、仿射变换与透视变换

OpenCV与图像处理学习四——图像几何变换&#xff1a;平移、缩放、旋转、仿射变换与透视变换二、图像的几何变换2.1 图像平移2.2 图像缩放&#xff08;上采样与下采样&#xff09;2.3 图像旋转2.4 仿射变换2.5 透视变化2.6 几何变化小结续上次的笔记&#xff1a;OpenCV与图像处…

课后作业和动手动脑

一&#xff0c;运行TestInherits.java 通过super调用基类构造方法&#xff0c;必是子类构造方法中的第一个语句。 二.为什么子类的构造方法在运行之前&#xff0c;必须调用父类的构造方法&#xff1f;能不能反过来&#xff1f;为什么不能反过来&#xff1f; 构造函数的主要作用…

OpenCV与图像处理学习五——图像滤波与增强:线性、非线性滤波、直方图均衡化与Gamma变换

OpenCV与图像处理学习五——图像滤波与增强&#xff1a;线性、非线性滤波、直方图均衡化与Gamma变换三、图像滤波与增强3.1 线性滤波3.1.1 方框滤波3.1.2 均值滤波3.1.3 高斯滤波3.1.4 一般卷积滤波3.2 非线性滤波3.2.1 中值滤波3.2.2 双边滤波3.3 图像直方图均衡化3.3.1 单通道…

张钹院士:人工智能技术已进入第三代

来源&#xff1a;经济观察报近日&#xff0c;中科院院士、清华大学人工智能研究院院长张钹教授接受记者采访时认为&#xff0c;目前基于深度学习的人工智能在技术上已经触及天花板。从长远来看&#xff0c;必须得走人类智能这条路&#xff0c;最终要发展人机协同&#xff0c;人…

软件工程作业

典型用户1 名字老陈性别&#xff0c;年龄男&#xff0c;40岁职业教师收入两万/年知识层次和能力本科&#xff0c;熟练计算机操作生活、工作情况教书&#xff0c;辅导孩子完成作业动机&#xff0c;目的&#xff0c;困难希望节省辅导孩子的时间&#xff0c;用于自己的业务工作用户…

numpy.ndarray索引/切片方式

注意&#xff1a;获得多维数组的前三个子数组不能用array[0,1,2]&#xff0c;应该用 array[0:3]&#xff0c;如下例子&#xff1a; a np.random.random([85, 7794, 64]) b a[0:3] print(np.shape(b)) # (3, 7794, 64)

OpenCV与图像处理学习六——图像形态学操作:腐蚀、膨胀、开、闭运算、形态学梯度、顶帽和黑帽

OpenCV与图像处理学习六——图像形态学操作&#xff1a;腐蚀、膨胀、开、闭运算、形态学梯度、顶帽和黑帽四、图像形态学操作4.1 腐蚀和膨胀4.1.1 图像腐蚀4.1.2 图像膨胀4.2 开运算与闭运算4.2.1 开运算4.2.2 闭运算4.3 形态学梯度&#xff08;Gradient&#xff09;4.4顶帽和黑…

解密硅谷大骗局

来源&#xff1a;硅谷封面企鹅号、腾讯科技在许多为人称道的科技创业故事中&#xff0c;总不乏硅谷的名字。从英特尔、IBM到微软、苹果&#xff0c;从雅虎、谷歌到Twitter、Facebook&#xff0c;这里诞生了很多知名科技企业。对于全球的创业者来说&#xff0c;硅谷就是梦想中的…

OpenCV与图像处理学习七——传统图像分割之阈值法(固定阈值、自适应阈值、大津阈值)

OpenCV与图像处理学习七——传统图像分割之阈值法&#xff08;固定阈值、自适应阈值、大津阈值&#xff09;一、固定阈值图像分割1.1 直方图双峰法1.2 OpenCV中的固定阈值分割二、自动阈值图像分割2.1 自适应阈值法2.2 迭代法阈值分割2.3 Otsu大津阈值法前面的笔记介绍了一些Op…

Foxmail 绑定企业邮箱

转载于:https://www.cnblogs.com/wu628/p/4955017.html

边缘计算将吞掉云计算!

来源&#xff1a;CSDN以下为译文&#xff1a;边缘计算已成为物联网的重要趋势。高德纳咨询公司认为边缘计算是2019年的一项技术趋势。各个物联网公司发现在将数据发送到云之前&#xff0c;通过边缘计算处理数据有很大的好处。最近Micron/Forrester的调查证实了这一趋势&#xf…

OpenCV与图像处理学习八——图像边缘提取(Canny检测代码)

OpenCV与图像处理学习八——图像边缘提取&#xff08;Canny检测代码&#xff09;一、图像梯度1.1 梯度1.2 图像梯度二、梯度图与梯度算子2.1模板卷积2.2 梯度图2.3 梯度算子2.3.1 Roberts交叉算子2.3.2 Prewitt算子2.3.3 Sobel算子三、Canny边缘检测算法&#xff08;代码实现&a…

面向人工智能的计算机体系结构

来源&#xff1a;计算机研究与发展前 言近几年来人工智能技术的飞速发展使得其应用迅猛扩大&#xff0c;而传统的计算机体系结构对于面向人工智能的应用在处理速度、能耗、使用的方便性等方面有着诸多不足。随着人工智能应用的发展&#xff0c;面向人工智能的体系结构成为体系结…

OpenCV与图像处理学习九——连通区域分析算法(含代码)

OpenCV与图像处理学习九——连通区域分析算法&#xff08;含代码&#xff09;一、连通区域概要二、Two-Pass算法三、代码实现一、连通区域概要 连通区域&#xff08;Connected Component&#xff09;一般是指图像中具有相同像素值且位置相邻的前景像素点组成的图像区域&#x…

(180页PPT)|清华大学孙富春教授深度讲解: 人工智能技术与产业发展

来源&#xff1a;精智工厂[导读】本文是清华大学孙富春教授在机械工业出版社讲座交流PPT&#xff0c;孙教授从背景与历史、深度学习、脑认知、产业&#xff08;装备&#xff09;发展、发展趋势等五个方面详细解读了人工智能技术与产业发展。未来智能实验室是人工智能学家与科学…

OpenCV与图像处理学习十——区域生长算法(含代码)

OpenCV与图像处理学习十——区域生长算法&#xff08;含代码&#xff09;一、区域生长算法概要二、区域生长算法原理三、代码应用一、区域生长算法概要 区域生长是一种串行区域分割的图像分割方法。区域生长是指从某个像素出发&#xff0c;按照一定的准则&#xff0c;逐步加入…

FutureWarning: Using a non-tuple sequence for multidimensional indexing is deprecated

使用scipy模块时出现警告&#xff1a;FutureWarning: Using a non-tuple sequence for multidimensional indexing is deprecated; use arr[tuple(seq)] instead of arr[seq]. In the future this will be interpreted as an array index, arr[np.array(seq)], which will resu…