转载自   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。

JavaScript学习总结(七)——JavaScript函数(function)相关推荐

  1. 【Javascript】javascript学习 六 七 JavaScript 变量/运算符

    变量是用于存储信息的容器: x=5; length=66.10; 还记得在学校里学过的代数吗? 当您回忆在学校学过的代数课程时,想到的很可能是:x=5, y=6, z=x+y 等等. 还记得吗,一个字 ...

  2. JavaScript学习(七十三)—高阶函数

    JavaScript学习(七十三)-高阶函数 高阶函数:高阶函数是对其他函数进行操作的函数,它接收函数作为参数或将函数作为返回值输出 此时的fn就是一个高阶函数,函数也是一种数据类型,同样可以作为参数 ...

  3. JavaScript学习(七十)—函数中this的指向问题

    JavaScript学习(七十)-函数中this的指向问题 一.这些this的指向,是当我们调用函数的时候确定的,调用方式的不同决定了this的指向不同,一般指向我们的调用者

  4. JavaScript学习(七十六)—this的指向问题

    JavaScript学习(七十六)-this的指向问题 在文档中(全局环境中)直接使用this,代表的是window 在HTML事件处理程序中,如果将this作为实参传递给事件处理函数,this代表的 ...

  5. JavaScript学习(七十四)—递归函数

    JavaScript学习(七十四)-递归函数 一.什么是递归? 如果一个函数可以在内部调用其本身,那么这个函数就是递归函数,简单地说,函数内部自己调用自己,这个函数就是递归函数 由于递归很容易发生&q ...

  6. JavaScript学习(七十二)—严格模式

    JavaScript学习(七十二)-严格模式 JavaScript除了提供正常模式外,还提供了严格模式,ES5的严格模式是采用具有限制性JavaScript变体的一种方式,即在严格条件下运行JS代码, ...

  7. JavaScript学习(七十一)—call、apply、bind学习总结

    JavaScript学习(七十一)-call.apply.bind学习总结 一.call方法 call方法调用一个对象,简单的理解为调用函数的方式,但是它可以改变函数的this指向 二.apply() ...

  8. JavaScript学习(七十九)—值传递和地址传递

    JavaScript学习(七十九)-值传递和地址传递 一.值传递 二.地址传递

  9. JavaScript学习(七十八)—实现对数据的浅拷贝和深拷贝

    JavaScript学习(七十八)-实现对数据的浅拷贝和深拷贝 一.浅拷贝 浅拷贝:对于引用类型的数据只拷贝该数据的地址,这种拷贝称为浅拷贝 注意:拷贝出来的数据和原有的数据指向同一个空间,即他们操作 ...

最新文章

  1. python获取数组中大于某一阈值的那些索引值_java矩阵计算及其在统计中的应用(一)...
  2. python时间序列因果检验_Python Statsmodels的时间序列Ljung_Box检验
  3. unity调用普通java类_Unity中C#和Java的相互调用实例代码
  4. 星际战甲堕落轰击者结合目标_星际战甲-任务指南
  5. 国学精典书籍阅读记录
  6. 51nod-有限背包计数问题【dp】
  7. 无窗口激活ActiveX控件的bug
  8. php微信支付接口开发程序(概念篇)
  9. 七月刚入职的阿里测试开发岗-高频知识整理,内附面试题答案
  10. CentOS7安装MySQL初始密码设置:ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password:
  11. java怎样定义和使用数组,Java一维数组的定义和使用
  12. lua与c若干问题 - 专职C++ - C++博客
  13. 难道这个会是我的广角选择?
  14. svn删除文件或目录后提交失败及解决
  15. mysql获取当前时间+1天_mysql获取当前时间,前一天,后一天
  16. 关于Java的与操作和或操作
  17. 诛仙服务器技能修改,诛仙玩家浅析诛仙3技能修改所带来的轰动
  18. xcode 可以打开xmind_如何在 iPad 上玩转 XMind?
  19. 漫谈国内外Android生态:华为发布的 HMS 服务,对 Mate30 系列无法搭载 Google GMS 的补偿有多大(本人原创)
  20. chrome浏览器解除网页右键点击屏蔽方法

热门文章

  1. Redux从入门到进阶,看这一篇就够了!
  2. C++类型转换基本语法
  3. [蓝桥杯]最大连续子序列和
  4. Redis高效性探索--线程IO模型,通信协议
  5. mysql 剔除不可见字符_不可见字符,Excel里最隐蔽的坑
  6. 算法---会议最大安排问题
  7. python 学习中遇到的问题(持续更新中)
  8. 字典树(Trie树)的原理与实现
  9. Java -- 泛型
  10. Ink on paper HDU - 7058