JavaScript学习总结(七)——JavaScript函数(function)

转载自   JavaScript学习总结(七)——JavaScript函数(function)

一、函数基本概念

  为完成某一功能的程序指令(语句)的集合,称为函数。

二、JavaScript函数的分类

  1、自定义函数(我们自己编写的函数),如:function funName(){}

  2、系统函数(JavaScript自带的函数),如alert函数。

三、函数的调用方式

  1、普通调用:functionName(实际参数...)

  2、通过指向函数的变量去调用:

      var myVar=函数名;

      myVar(实际参数...);

四、函数返回值

  1.当函数无明确返回值时,返回的值就是"undefined"。

  2.当函数有返回值时,返回值是什么就返回什么。

函数测试代码:

<script type="text/javascript">var str="window.alert('孤傲苍狼');";eval(str);//eval() 函数可计算某个字符串,并执行其中的的 JavaScript 代码。/*自定义函数*/function test(str){alert(str);}window.alert(test);//输出test函数的定义//函数的调用方式1test("孤傲苍狼");//函数的调用方式2var myFunction=test;myFunction("白虎神皇");window.alert(myFunction);/*当函数无明确返回值时,返回的也是值 "undefined"*/var retVal=test("test");//test函数执行完之后,并没有返回值,因此retVal变量接收到的返回值结果是undefinedalert("retVal="+retVal);//输出undefined</script>

五、函数的深入使用

5.1、可变参数

  函数的参数列表可以是任意多个,并且数据类型可以是任意的类型,JavaScript的函数天然支持可变参数,JavaScript有一个arguments变量可以访问所有传到函数内部的参数。

范例:JavaScript使用arguments创建参数可变的函数

<script type="text/javascript">/*add函数是一个参数可变的函数*/function add(){var result=0;for(var i=0;i<arguments.length;i++){//alert(arguments[i]);result+=arguments[i];}return result;}alert("add(1,2,3)="+add(1,2,3));//调用add函数时传入3个参数alert("add(1,2,3,4,5,6)="+add(1,2,3,4,5,6));//调用add函数时传入6个参数alert("add()="+add());//调用add函数时不传入参数alert("add(1,\"HelloWorld\")="+add(1,"HelloWorld"));//调用add函数时传入不同类型的参数</script>

运行结果:

5.2、javascript创建动态函数

  JavaScript支持创建动态函数,动态函数必须用Function对象来定义(Function是javascript中的一个对象,是固定不变的,规定Function对象的"F"必须大写,当是function的时候,我们知道是定义函数的时候所使用的一个关键字:function funName(x,y),当是Function的时候(F大写的时候),我们知道是javascript中的对象)

  创建动态函数的基本格式:var 变量名 = new Function("参数1","参数2","参数n","执行语句");

  使用new关键字(new是javascript中一个关键字,也是固定的,我们在定义动态函数的时候必须要使用new来创建这个Function对象)

  我们先定义一个变量: var 变量名,在这里,变量名是随便的,然后我们再使用new关键字创建一个Function对象,然后再把这个对象赋值给这个任意的变量,也就是:var 变量名 = new Function("参数1","参数2","参数n","执行语句");Function后面的括号里先是传递给函数的参数,然后用一个逗号(,)隔开然后是这个函数要执行的功能的代码

看下面的一段代码:

<script type="text/javascript">var square = new Function ("x","y","var sum ; sum = x+y;return sum;");alert("square(2,3)的结果是:"+square(2,3));
</script>

  square是动态创建的函数,在Function对象后面的括号里的每一部分内容都必须是字符串形式的,也就是说都必须用引号(""或者是'')括起来,第一部分是传递给这个动态函数的第一个参数“x”,第二部分是传递给这个动态函数的第二个参数“y“,第三部分是这个函数要完成的功能的代码,这个函数要完成的功能是定义一个变量sum,让sum等于传递给这个函数的两个参数x和y的和,然后返回他们相加以后的值(return sum),调用后运行结果如下:

  

这段代码:

var square = new Function ("x","y","var sum ; sum = x+y;return sum;");

和下面这段代码:

function square (x,y){var sum;sum = x+y;return sum;
}

是一摸一样的,只不过一个是动态函数,一个是静态函数。

那下面我们就来想一下,为什么要用动态函数呢,动态函数有什么特殊的地方有什么优点呢?

在静态函数里是:

function square (x,y){var sum;sum = x+y;return sum;
}

而在动态函数里是:

 new Function ("x","y","var sum ; sum = x+y;return sum;");

  我们可以看到,每一个句子两边都加上了引号"x"还有"y"还有"var sum ; sum = x+y;; return sum;"这些两边都加上了引号,也就是说在new Function后面的小括号里面的每一个语句两边都是有引号的,也就是说他们都是以字符串的形式表示和被调用的,而字符串又是可以由变量来定义或者是改变的,也就是说,我们可以定义变量,让变量的值等于这些字符串:

<script type="text/javascript">var a = "var sum;";var b = "sum = x + y;";var c = "return sum;";var square = new Function ( "x", "y", a+b+c);alert(square (2,3));7 </script>

       在这里,我们定义了变量a,b,c,我们让a="var sum;",让b="sum = x+y;",让c = "return sum;"

  这样:var square = new Function ("x","y","var sum ; sum = x+y;return sum;");

  我们就可以写成:var square = new Function ( " x", "y",a+b+c);因为a,b,c是三个字符串,字符串相加得到的还是字符串。

  我们为什么要把代码分成一小段一小段的代码呢?,把一个字符串分成了若干个独立的字符串的优点就在于我们可以通过修改其中的某些字符串来随时改变函数的作用。

例如:

<script type="text/javascript">var a = "var sum;";var b = "sum = x + y;";var c = "return sum;";var square = new Function ( "x", "y", a+b+c);alert(square (2,3));b = "sum = x -y;";square = new Function ( " x", "y",a+b+c);alert(square (2,3));</script>

  我们在程序运行的过程中,把b = "sum = x+y;";改成了"sum = x-y;";这样我们再把修改了值以后的变量b,放到var square = new Function ( "x", "y", a+b+c);中,

那("x","y","var sum ; sum = x+y;return sum;");就变成了:("x","y","var sum ; sum = x - y;return sum;");我们把传递给这个动态函数的参数2和3放进去,就变成了2-3,结果是-1。

5.3、匿名函数

var f1 = function(i1, i2) {return i1 + i2;
}
alert(f1(1,2));

  这种匿名函数的用法在JQuery中的非常多

alert(function(i1, i2) { return i1 + i2; }(10,10));

  直接声明一个匿名函数,立即使用。用匿名函数的好处就是省得定义一个用一次就不用的函数,而且免了命名冲突的问题,js中没有命名空间的概念,因此很容易函数名字冲突,一旦命名冲突以最后声明的为准。

5.4、JavaScript不支持函数的重载

  JavaScript没有方法重载的说法,如果两个方法名字一样,即使参数个数不一样,那么后面定义的就会覆盖前面定义,调用方法时永远是调用后定义的那个。

用如下的代码证明JavaScript不支持函数的重载:

<script type="text/javascript">function Test(a){alert(a);}function Test(a,b){alert("HelloWorld!");}function Test(a,b){alert(a+" "+b);}Test(20);//调用的是最后定义的那个Test方法Test(30,50);//调用的是最后定义的那个Test方法
</script>

运行结果:

  

  JS引擎调用一个函数时,是根据函数名来调用的,如果有多个函数名相同的函数,那么JS引擎则只认最后定义的那个,调用时以最后定义的那个函数为准!

  JS的函数没有专门的函数默认值的语法,但是可以不给参数传值,不传值的参数值就是undefined。

 

 

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

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

相关文章

JavaScript学习总结(八)——JavaScript数组

转载自 JavaScript学习总结(八)——JavaScript数组 JavaScript中的Array对象就是数组&#xff0c;首先是一个动态数组&#xff0c;无需预先制定大小&#xff0c;而且是一个像Java中数组、ArrayList、Hashtable等的超强综合体。 一、数组的声明 常规方式声明&#xff1a; 1、…

命令点无效怎么处理_CAD执行修改命令,你试过重复选择对象吗?

你在执行命令的时候&#xff0c;是习惯先选择对象还是之后才选择对象的呢&#xff1f;不知道细心的你有没有发觉&#xff0c;明明已经先选择对象了才执行命令&#xff0c;为什么之后还要重复选择对象&#xff1f;这里可以分几种情况来讨论一下。CAD版本&#xff1a;中望CAD 202…

一起脱去小程序的外套和内衣 - 微信小程序架构解析

作者介绍&#xff1a; 渠宏伟&#xff0c;腾讯高级工程师&#xff0c;从事Web前端开发5年&#xff0c;先后负责企鹅电竞、腾讯视频VIP、腾讯OA开发框架、腾讯微信HR助手等项目。对Web前端架构、.NET架构有丰富的经验。 | 导语 微信小程序的公测掀起了学习小程序开发的浪潮&…

JavaScript学习总结(九)——Javascript面向(基于)对象编程

转载自 JavaScript学习总结(九)——Javascript面向(基于)对象编程 一、澄清概念 1.JS中"基于对象面向对象" 2.JS中没有类(Class)&#xff0c;但是它取了一个新的名字叫“原型对象”&#xff0c;因此"类原型对象" 二、类(原型对象)和对象(实例)的区别与联…

将Springboot项目放在服务器上一直运行

nohup java -jar hz-sms-0.0.1-SNAPSHOT.jar >/www/wwwroot/...-0.0.1-SNAPSHOT.out 2>&1 &

迁移数据库到SQL on Linux Docker

问题引入 前一篇文章&#xff0c;菜鸟找到了SQL on Linux Docker容器销毁后&#xff0c;容器中的数据库文件可以得以保留的方法&#xff0c;老鸟非常开心。所以&#xff0c;今天又提出了新的问题&#xff1a;“鸟儿&#xff0c;如果我想把我的数据库从SQL on Windows迁移到SQL …

Spring IoC 容器

转载自 Spring IoC 容器 IoC 容器 Spring 容器是 Spring 框架的核心。容器将创建对象&#xff0c;把它们连接在一起&#xff0c;配置它们&#xff0c;并管理他们的整个生命周期从创建到销毁。Spring 容器使用依赖注入&#xff08;DI&#xff09;来管理组成一个应用程序的组…

字段缺失_区分Protobuf 3中缺失值和默认值

来自公众号&#xff1a;新世界杂货铺这两天翻了翻以前的项目&#xff0c;发现不同项目中关于Protobuf 3缺失值和默认值的区分居然有好几种实现。今天笔者冷饭新炒&#xff0c;结合项目中的实现以及切身经验共总结出如下六种方案。增加标识字段众所周知&#xff0c;在Go中数字类…

当初怎么就入了VS的坑

使用Turbo C和Turbo Pascal开始学习编程貌似也是一代人的集体记忆。这方面我也没什么忌讳&#xff0c;毕竟Borland Turbo C在九十年代末的PC上面还是一个运行效率不错的开发工具。然而启蒙老师的水平限制&#xff0c;那个时候所学习的编写和调试技术都不过关&#xff0c;一个超…

Mysql截取字段中 用逗号分割 省市县镇街道社区小区

Mysql截取字段中 用逗号分割 省市县镇街道社区小区 select id , name, substring_index(name,,,0) as province0, substring_index(name,,,1) as province1, substring_index(name,,,2) as province2, substring_index(name,,,3) as province3, substring_index(name,,,4) as…

如何导出Navicat的数据库连接配置

如何导出Navicat的数据库连接配置 如何导出Navicat的数据库连接配置_石头wang的博客-CSDN博客_navicat 导出配置 如何导出Navicat的数据库连接配置 背景 我们可能会在不同的电脑安装Navicat&#xff0c;这些连接的配置如何从一台电脑迁移到另外一条&#xff1f;自行备份是比较…

C#开发人员应该知道的13件事情

本文讲述了C#开发人员应该了解到的13件事情&#xff0c;希望对C#开发人员有所帮助。 1. 开发过程 开发过程是错误和缺陷开始的地方。使用工具可以帮助你在发布之后&#xff0c;解决掉一些问题。 编码标准 遵照编码标准可以编写出更多可维护的代码&#xff0c;特别是在由多个开发…

充电提示音_iPhone如何自定义充电提示音,图文教程

昨天给小伙伴们分享了几个iOS14的充电提示音和设置方法&#xff0c;不过有的小伙伴可能需要设置自己喜欢的声音为充电提示音&#xff0c;所以今天就来教大家自定义喜欢的iOS14充电提示音。教程由于比较仔细&#xff0c;看起来比较长&#xff0c;其实很简单&#xff0c;主要分为…

Scanner获取用户输入

next()和hasNext() public class Demo02_Scanner {public static void main(String[] args) {//创建一个扫描器对象&#xff0c;用于接收键盘数据Scanner scanner new Scanner(System.in);System.out.println("使用next方式接收: ");//判断用户有没有输入字符串if …

idea Lombok插件

此文提供对于Lombok的简单使用 1、Lombok简介 Lombok能通过注解的方式&#xff0c;在编译时自动为属性生成构造器、getter/setter、equals、hashcode、toString方法。 2、Lombok插件安装 想要使用 Lombok&#xff0c;必须要安装一个 Lombok 插件&#xff0c;不然编辑器无法识…

赫夫曼编码字节数组

思路分析 代码实现 package com.atguigu.huffmancode;import com.sun.org.glassfish.external.statistics.CountStatistic; import com.sun.org.glassfish.external.statistics.StringStatistic;import java.util.*;/*** 创建人 wdl* 创建时间 2021/3/27* 描述*/ public class…

.NET Core 工具中的新内容

Visual Studio 2017 RC最近一个版本更新包括一套更新的.NET Core工具箱。这个版本带来了几项改进&#xff0c;包括改变了模版化、dotnet网络命令&#xff0c;以及许多缺陷修复。微软的Rich Lander发表了一份更新说明&#xff0c;陈述了.NET Core开发人员可以预期在.NET Core RC…

你还可以续命几次?回顾DockPanel Suite项目的发展史

微软在设计Visual Studio.NET的时候汲取了之前IDE版本的各种教训&#xff0c;开始考虑怎样让开发人员能够快速调整多窗口的布局&#xff0c;灵活构建自己喜欢的日常界面。这种基于菜单条和悬浮面板的新界面也让Windows平台其他软件开发者豁然开朗&#xff0c;开始各种借鉴。微软…