一、函数基本概念

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

二、JavaScript函数的分类

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

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

三、函数的调用方式

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

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

      var myVar=函数名;

      myVar(实际参数...);

四、函数返回值

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

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

函数测试代码:

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

五、函数的深入使用

5.1、可变参数

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

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

 1 <script type="text/javascript">
2 /*add函数是一个参数可变的函数*/
3 function add(){
4 var result=0;
5 for(var i=0;i<arguments.length;i++){
6 //alert(arguments[i]);
7 result+=arguments[i];
8 }
9
10 return result;
11 }
12 alert("add(1,2,3)="+add(1,2,3));//调用add函数时传入3个参数
13 alert("add(1,2,3,4,5,6)="+add(1,2,3,4,5,6));//调用add函数时传入6个参数
14 alert("add()="+add());//调用add函数时不传入参数
15 alert("add(1,\"HelloWorld\")="+add(1,"HelloWorld"));//调用add函数时传入不同类型的参数
16 </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后面的括号里先是传递给函数的参数,然后用一个逗号(,)隔开然后是这个函数要执行的功能的代码

看下面的一段代码:

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

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

  

这段代码:

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

和下面这段代码:

1 function square (x,y){
2 var sum;
3 sum = x+y;
4 return sum;
5 }

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

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

在静态函数里是:

1 function square (x,y){
2 var sum;
3 sum = x+y;
4 return sum;
5 }

而在动态函数里是:

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

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

 1 <script type="text/javascript">
2 var a = "var sum;";
3 var b = "sum = x + y;";
4 var c = "return sum;";
5 var square = new Function ( "x", "y", a+b+c);
6 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是三个字符串,字符串相加得到的还是字符串。

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

例如:

 1 <script type="text/javascript">
2 var a = "var sum;";
3 var b = "sum = x + y;";
4 var c = "return sum;";
5 var square = new Function ( "x", "y", a+b+c);
6 alert(square (2,3));
7 b = "sum = x -y;";
8 square = new Function ( " x", "y",a+b+c);
9 alert(square (2,3));
10 </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、匿名函数

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

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

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

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

5.4、JavaScript不支持函数的重载

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

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

 1  <script type="text/javascript">
2 function Test(a){
3 alert(a);
4 }
5 function Test(a,b){
6 alert("HelloWorld!");
7 }
8 function Test(a,b){
9 alert(a+" "+b);
10 }
11
12 Test(20);//调用的是最后定义的那个Test方法
13 Test(30,50);//调用的是最后定义的那个Test方法
14 </script>

运行结果:

  

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

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

JavaScript学习总结(3)——JavaScript函数(function)的更多相关文章

  1. JavaScript:学习笔记(5)——箭头函数=>以及实践

    JavaScript:学习笔记(5)——箭头函数=>以及实践 ES6标准新增了一种新的函数:Arrow Function(箭头函数).本文参考的链接如下: MDN箭头函数:https://dev ...

  2. javascript中的立即执行函数(function(){…})()

    javascript中的立即执行函数(function(){…})() 深入理解javascript中的立即执行函数,立即执行函数也叫立即调用函数,通常它的写法是用(function(){…})()包 ...

  3. JavaScript学习(1)之JavaScript基础

    JavaScript学习(1)之JavaScript基础 由于工作原因,开发语言逐渐以JavaScript为主,所以,抽空学习了下JavaScript语法.等现阶段的工作稳定之后,陆续会分享下自己在学 ...

  4. JavaScript学习总结(四)function函数部分

    转自:http://segmentfault.com/a/1190000000660786 概念 函数是由事件驱动的或者当它被调用时执行的可重复使用的代码块. js 支持两种函数:一类是语言内部的函数 ...

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

    一.函数基本概念 为完成某一功能的程序指令(语句)的集合,称为函数. 二.JavaScript函数的分类 1.自定义函数(我们自己编写的函数),如:function funName(){} 2.系统函 ...

  6. 理解javascript中的立即执行函数(function(){})()

    之前看了好多代码,都有用到这种函数的写法,但是都没认真的去想为什么会这样写,今天开始想学习下jquery的源码,发现jquery也是使用这种方式,用(function(window, undefine ...

  7. 深入理解javascript中的立即执行函数(function(){…})()

    投稿:junjie 字体:[增加 减小] 类型:转载 时间:2014-06-12 我要评论 这篇文章主要介绍了深入理解javascript中的立即执行函数,立即执行函数也叫立即调用函数,通常它的写法是 ...

  8. 【转】深入理解javascript中的立即执行函数(function(){…})()

    javascript和其他编程语言相比比较随意,所以javascript代码中充满各种奇葩的写法,有时雾里看花,当然,能理解各型各色的写法也是对javascript语言特性更进一步的深入理解. ( f ...

  9. javascript学习(二)--函数

    一.在JavaScript中,定义函数的方式如下: 1.第一种方式: function abs(x) { if (x >= 0) { return x; } else { return -x; ...

  10. javascript 学习总结(五)Function对象

    1.Function  函数调用(类似call方法) function callSomeFunction(someFunction, someArgument){ return someFunctio ...

随机推荐

  1. leetcode第一刷_Text Justification

    这个题的接受率好低,搞得我一直不敢做.后来认真的看了一下题目,不是非常难嘛.字符串的题目ac率就是低,除了难,还由于它的測试用例太多. 思路不难,主要是由于特殊情况太多.纯模拟,我把全部的情况罗列一下 ...

  2. 服务器性能监控tips

    一.tops 第一行 当前时间/已运行时间/登录用户数/最近 5 10 15分钟平均负载(平均进程数 cat /proc/loadavg) 除了前3个数字表示平均进程数量外,后面的1个分数,分母表示系 ...

  3. 深度学习 —— 使用 gensim 实现 word2vec

    在自然语言处理领域中,将单词(words)或词语(phases)映射到向量空间(vector space)中可以很容易就得到单词之间的相似度,因为向量空间中两个向量的相似度很容易求得,比如余弦相似度. ...

  4. Mac OSX 平台安装 MongoDB

    Mac OSX 平台安装 MongoDB MongoDB 提供了 OSX 平台上 64 位的安装包,你可以在官网下载安装包. 下载地址:https://www.mongodb.com/download ...

  5. spring mvc获取路径参数的几种方式

    一.从视图向controller传递值,  controller <--- 视图 1.通过@PathVariabl注解获取路径中传递参数 (参数会被复制到路径变量) @RequestMappin ...

  6. POJ 1330 Nearest Common Ancestors 倍增算法的LCA

    POJ 1330 Nearest Common Ancestors 题意:最近公共祖先的裸题 思路:LCA和ST我们已经很熟悉了,但是这里的f[i][j]却有相似却又不同的含义.f[i][j]表示i节 ...

  7. 动态调用web服务 --WSHelper.cs

    using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Net;us ...

  8. [Chromium文档转载,第004章]Mojo Synchronous Calls

    For Developers‎ > ‎Design Documents‎ > ‎Mojo‎ > ‎ Synchronous Calls Think carefully before ...

  9. DEDE 修改后台图集上传单个图片的大小限制

    默认情况下,DEDE图集中单个图片大小限制在2M以内,而有时我们需要上传一个2M以上的文件,这是只要修改几个文件就可以实现了. 一.需要修改php.ini这个文件,我们必须保证PHP的配置中允许上传一 ...

  10. react入门安装

    react的入门安装 1.react的适用方法有两种,其一是依赖在线的cdn地址: https://reactjs.org/docs/cdn-links.html 官方给的cdn地址如下 <sc ...