第八章 函数

1 函数声明和函数表达式

差别一:函数声明:函数在执行代码前被创建;函数表达式是在运行阶段执行代码时创建;

差别二:函数声明创建一个与函数同名的变量,并让她指向函数;使用函数表达式,不给函数指定名称,

因此要么在代码中将函数赋给一个变量,要么以其他方式使用函数表达式;

差别三:函数声明不返回指向函数的引用;而是创建一个与函数同名的变量,并将指向函数的引用赋给它;函数表达式返回一个引用,该引用指向函数表达式创建的函数;

差别四:函数声明是完整的语句,而函数表达式是语句的一部分;

共同一:函数都可以被看做引用,函数引用是一个指向函数的值;quack函数存储在同名变量quack;fly显式存储;可以在变量中存储指向函数的引用;

共同二:可以用相同的方式处理调用他们的语句

例:

  1. <script language="JavaScript" type="text/JavaScript">
  2.  
  3. var migrating=true;
  4.  
  5. //函数表达式
  6.  
  7. var fly=function(num){
  8.  
  9. for(var i=0;i<num;i++)
  10.  
  11. {
  12.  
  13. console.log("Flying!");
  14.  
  15. }
  16.  
  17. };
  18.  
  19. //函数声明
  20.  
  21. function quack(num){
  22.  
  23. for(var i=0;i<num;i++)
  24.  
  25. {
  26.  
  27. console.log("Quack!");
  28.  
  29. }
  30.  
  31. }
  32.  
  33. //调用
  34.  
  35. if(migrating)
  36.  
  37. {
  38.  
  39. var superquack=quack;//创建变量实现再引用
  40.  
  41. superquack(2);
  42.  
  43. var superfly=fly;
  44.  
  45. superfly(3);
  46.  
  47. //quack(4);
  48.  
  49. //fly(3);
  50.  
  51. }
  52.  
  53. </script>

2函数是一个一等值

可以将函数赋给变量;

可以将函数传递给函数;

可以从函数返回函数;

例:

  1. <!doctype html>
  2.  
  3. <html lang="en">
  4.  
  5. <head>
  6.  
  7. <title>First Class</title>
  8.  
  9. <meta charset="utf-8">
  10.  
  11. <style type="text/css">
  12.  
  13. </style>
  14.  
  15. <script language="JavaScript" type="text/JavaScript">
  16.  
  17. //表示乘客的数据结构
  18.  
  19. var passenger=[{name:"Jane Doloop",paid:true,ticket:"coach"},
  20.  
  21. {name:"Dr.Evel",paid:true,ticket:"firstclass"},
  22.  
  23. {name:"Sue proprty",paid:false,ticket:"firstclass"},
  24.  
  25. {name:"John Funcall",paid:true,ticket:"coach"}
  26.  
  27. ];
  28.  
  29. //方法一:传统分步检验函数
  30.  
  31. /*
  32.  
  33. //检查是否买票
  34.  
  35. function checkPaid(passenger){
  36.  
  37. for(var i=0;i<passenger.length;i++)
  38.  
  39. if(!passenger[i].paid)
  40.  
  41. {
  42.  
  43. console.log("The plane can't take off:"+passenger[i].name+" hasn't paid!");
  44.  
  45. return false;
  46.  
  47. }
  48.  
  49. return true;
  50.  
  51. }
  52.  
  53. //检查是否乘客在禁飞名单
  54.  
  55. function checkNoFly(passenger){
  56.  
  57. for(var i=0;i<passenger.length;i++)
  58.  
  59. if(passenger[i].name=="Dr.Evel")
  60.  
  61. {
  62.  
  63. console.log("The plane can't take off:"+passenger[i].name+" is on the no-fly-list!");
  64.  
  65. return false;
  66.  
  67. }
  68.  
  69. return true;
  70.  
  71. }
  72.  
  73. //打印乘客姓名
  74.  
  75. function printPassenger(passenger){
  76.  
  77. for(var i=0;i<passenger.length;i++){
  78.  
  79. console.log(passenger[i].name)
  80.  
  81. }
  82.  
  83. }
  84.  
  85. //主调函数
  86.  
  87. printPassenger(passenger);
  88.  
  89. if(checkPaid(passenger))
  90.  
  91. {
  92.  
  93. if(checkNoFly(passenger))
  94.  
  95. console.log("The plane could take off!");
  96.  
  97. }
  98.  
  99. */
  100.  
  101. //方法二:传递函数简化代码
  102.  
  103. //迭代乘客
  104.  
  105. function processPassenger(passenger,testFunction)
  106.  
  107. {
  108.  
  109. for(var i=0;i<passenger.length;i++)
  110.  
  111. if(testFunction(passenger[i]))
  112.  
  113. return false;
  114.  
  115. return true;
  116.  
  117. }
  118.  
  119. //打印乘客名单
  120.  
  121. function printPassenger(passenger)
  122.  
  123. {
  124.  
  125. var ifpaid;
  126.  
  127. if(passenger.paid)
  128.  
  129. ifpaid="已";
  130.  
  131. else
  132.  
  133. ifpaid="未";
  134.  
  135. console.log(passenger.name+" "+ifpaid+"购票");
  136.  
  137. }
  138.  
  139. //禁飞名单检测
  140.  
  141. function checkNoFlyList(passenger)
  142.  
  143. {
  144.  
  145. return (passenger.name==="Dr.Evel");
  146.  
  147. }
  148.  
  149. //检查乘客是否已买票
  150.  
  151. function checkNotpaid(passenger)
  152.  
  153. {
  154.  
  155. return (!passenger.paid);
  156.  
  157. }
  158.  
  159. //打印乘客名单
  160.  
  161. processPassenger(passenger,printPassenger);
  162.  
  163. //向函数传递函数
  164.  
  165. var allCanFly=processPassenger(passenger,checkNoFlyList);
  166.  
  167. if(!allCanFly)
  168.  
  169. console.log("The plane can't take off:we have a passenger on the no-fly-list!");
  170.  
  171. var allPaid=processPassenger(passenger,checkNotpaid)
  172.  
  173. if(!allPaid)
  174.  
  175. console.log("The plane can't take off:not everyone has paid!");
  176.  
  177. //乘客点饮料
  178.  
  179. function createDrinkOrder(passenger)
  180.  
  181. {
  182.  
  183. var orderFunction;//创建一个变量用于存储要返回的函数
  184.  
  185. if (passenger.ticket==="firstclass")
  186.  
  187. {
  188.  
  189. orderFunction=function(){
  190.  
  191. alert("Would you like a cocktail or wine?");
  192.  
  193. };
  194.  
  195. }else{
  196.  
  197. orderFunction=function(){
  198.  
  199. alert("Your choice is cola or water.");
  200.  
  201. };
  202.  
  203. }
  204.  
  205. return orderFunction;//返回函数
  206.  
  207. }
  208.  
  209. //提供服务的函数
  210.  
  211. function serverCustomer(passenger)
  212.  
  213. {
  214.  
  215. var getDrinkOrderFunction=createDrinkOrder(passenger);//获取返回函数
  216.  
  217. getDrinkOrderFunction();//调用函数
  218.  
  219. //让乘客点餐
  220.  
  221. //getDrinkOrderFunction();
  222.  
  223. //播放电影
  224.  
  225. //getDrinkOrderFunction();
  226.  
  227. //清理垃圾
  228.  
  229. //getDrinkOrderFunction();
  230.  
  231. }
  232.  
  233. //顾客调用服务
  234.  
  235. function serverPassenger(passenger)
  236.  
  237. {
  238.  
  239. for(var i=0;i<passenger.length;i++)
  240.  
  241. {
  242.  
  243. serverCustomer(passenger[i]);
  244.  
  245. }
  246.  
  247. }
  248.  
  249. serverPassenger(passenger);
  250.  
  251. </script>
  252.  
  253. </head>
  254.  
  255. <body>
  256.  
  257. </body>
  258.  
  259. </html>

3 数组的sort方法

  1. <!doctype html>
  2.  
  3. <html lang="en">
  4.  
  5. <head>
  6.  
  7. <title>Drink PAIXU</title>
  8.  
  9. <meta charset="utf-8">
  10.  
  11. <style type="text/css">
  12.  
  13. </style>
  14.  
  15. <script language="JavaScript" type="text/JavaScript">
  16.  
  17. var products=[{name:"Grapefruit",calories:170,color:"red",sold:8200},
  18.  
  19. {name:"Orange",calories:160,color:"orange",sold:12101},
  20.  
  21. {name:"Cola",calories:210,color:"caramel",sold:25412},
  22.  
  23. {name:"Diet",calories:0,color:"caramel",sold:43922},
  24.  
  25. {name:"Lemon",calories:200,color:"clear",sold:14983},
  26.  
  27. {name:"Raspberry",calories:180,color:"pink",sold:9427},
  28.  
  29. {name:"Root Beer",calories:200,color:"caramel",sold:9909},
  30.  
  31. {name:"Water",calories:0,color:"clear",sold:62123},
  32.  
  33. ];
  34.  
  35. // sort and display the scores
  36.  
  37. console.log("\n------- sorting by sold -------");
  38.  
  39. products.sort(compareSold);
  40.  
  41. printProducts(products);
  42.  
  43. console.log("\n------- sorting by name -------");
  44.  
  45. products.sort(compareName);
  46.  
  47. printProducts(products);
  48.  
  49. console.log("\n------- sorting by calories -------");
  50.  
  51. products.sort(compareCalories);
  52.  
  53. printProducts(products);
  54.  
  55. console.log("\n------- sorting by color -------");
  56.  
  57. products.sort(compareColor);
  58.  
  59. printProducts(products);
  60.  
  61. function compareName(colaA, colaB) {
  62.  
  63. if (colaA.name > colaB.name) {
  64.  
  65. return 1;
  66.  
  67. } else if (colaA.name === colaB.name) {
  68.  
  69. return 0;
  70.  
  71. } else {
  72.  
  73. return -1;
  74.  
  75. }
  76.  
  77. }
  78.  
  79. function compareCalories(colaA, colaB) {
  80.  
  81. if (colaA.calories > colaB.calories) {
  82.  
  83. return 1;
  84.  
  85. } else if (colaA.calories === colaB.calories) {
  86.  
  87. return 0;
  88.  
  89. } else {
  90.  
  91. return -1;
  92.  
  93. }
  94.  
  95. }
  96.  
  97. function compareColor(colaA, colaB) {
  98.  
  99. if (colaA.color > colaB.color) {
  100.  
  101. return 1;
  102.  
  103. } else if (colaA.color === colaB.color) {
  104.  
  105. return 0;
  106.  
  107. } else {
  108.  
  109. return -1;
  110.  
  111. }
  112.  
  113. }
  114.  
  115. function compareSold(colaA, colaB) {
  116.  
  117. if (colaA.sold > colaB.sold) {
  118.  
  119. return 1;
  120.  
  121. } else if (colaA.sold === colaB.sold) {
  122.  
  123. return 0;
  124.  
  125. } else {
  126.  
  127. return -1;
  128.  
  129. }
  130.  
  131. }
  132.  
  133. //打印函数
  134.  
  135. function printProducts(products) {
  136.  
  137. for (var i = 0; i < products.length; i++) {
  138.  
  139. console.log("Name: " + products[i].name +
  140.  
  141. ", Calories: " + products[i].calories +
  142.  
  143. ", Color: " + products[i].color +
  144.  
  145. ", Sold: " + products[i].sold);
  146.  
  147. }
  148.  
  149. }
  150.  
  151. </script>
  152.  
  153. </head>
  154.  
  155. <body>
  156.  
  157. </body>
  158.  
  159. </html>

3 匿名函数

是没有名称的函数表达式,使用匿名函数可以让代码更简单

如:

window.onload=function(){alert("Yeah,that page loaded!");};

setTimeout(function(){alert("Time to ttake the cookies out of the oven.");},6000);

4 嵌套函数

在其他函数中定义的函数,与局部变量一样,嵌套函数的作用域也是局部的;

词法作用域:通过阅读代码可以确定变量的作用域;

自由变量:在函数体内未绑定的变量;

闭包:函数和引用环境[环境为实际环境而非环境副本];

闭包应用;避免全局变量命名冲突,使用受保护的局部变量实现计数;

  1. <!doctype html>
  2.  
  3. <html lang="en">
  4.  
  5. <head>
  6.  
  7. <title>Bibao Counter</title>
  8.  
  9. <meta charset="utf-8">
  10.  
  11. <style type="text/css">
  12.  
  13. </style>
  14.  
  15. <script language="JavaScript" type="text/JavaScript">
  16.  
  17. //原来
  18.  
  19. var count=0;
  20.  
  21. function counter(){
  22.  
  23. count=count+1;
  24.  
  25. return count;
  26.  
  27. }
  28.  
  29. console.log(counter());
  30.  
  31. console.log(counter());
  32.  
  33. console.log(counter());
  34.  
  35. //使用闭包
  36.  
  37. function makeCounter(){
  38.  
  39. var count=0;
  40.  
  41. function counter(){
  42.  
  43. count=count+1;
  44.  
  45. return count;
  46.  
  47. }
  48.  
  49. return counter;
  50.  
  51. }
  52.  
  53. var doCount=makeCounter();//调用makeCounter()获得闭包(函数及其环境)
  54.  
  55. console.log(doCount());//除了调用doCount没有其他办法访问count
  56.  
  57. console.log(doCount());
  58.  
  59. console.log(doCount());
  60.  
  61. </script>
  62.  
  63. </head>
  64.  
  65. <body>
  66.  
  67. </body>
  68.  
  69. </html>

闭包案例2——将函数表达式用作实参创建闭包

  1. function makeTimer(doneMessage,n){
  2.  
  3. setTimeout(function(){alert(doneMessage);},n);
  4.  
  5. }
  6.  
  7. makeTimer("Cookies are done!",1000);

闭包案例3——利用返回对象创建闭包

  1. function makeCounter(){
  2.  
  3. var count=0;
  4.  
  5. return {//返回对象
  6.  
  7. increment:function(){//对象方法
  8.  
  9. count++;
  10.  
  11. return count;
  12.  
  13. }
  14.  
  15. };
  16.  
  17. }
  18.  
  19. var counter=makeCounter();
  20.  
  21. console.log(counter.increment());//调用对象方法

闭包案例4——利用返回且传递实参再函数创建闭包

  1. function multN(n){
  2.  
  3. return function multBy(m){
  4.  
  5. return n*m;
  6.  
  7. };
  8.  
  9. }
  10.  
  11. var multBy3=multN(3);
  12.  
  13. console.log("Multiplying 2:"+multBy3(2));
  14.  
  15. console.log("Multiplying 4:"+multBy3(4));

闭包案例5——使用事件处理程序来创建闭包

  1. <!doctype html>
  2.  
  3. <html lang="en">
  4.  
  5. <head>
  6.  
  7. <title>Click me!</title>
  8.  
  9. <meta charset="utf-8">
  10.  
  11. <style type="text/css">
  12.  
  13. </style>
  14.  
  15. <script language="JavaScript" type="text/JavaScript">
  16.  
  17. //不使用闭包
  18.  
  19. /*
  20.  
  21. var count=0;
  22.  
  23. window.onload=function(){
  24.  
  25. var button=document.getElementById("clickme");
  26.  
  27. button.onclick=handleClick;
  28.  
  29. };
  30.  
  31. function handleClick(){
  32.  
  33. var message="You clicked me ";
  34.  
  35. var div=document.getElementById("message");
  36.  
  37. count++;
  38.  
  39. div.innerHTML=message+count+" times!";
  40.  
  41. }
  42.  
  43. */
  44.  
  45. //使用闭包
  46.  
  47. window.onload=function(){
  48.  
  49. var count=0;
  50.  
  51. var message="You clicked me ";
  52.  
  53. var div=document.getElementById("message");
  54.  
  55. var button=document.getElementById("clickme");
  56.  
  57. button.onclick=function(){
  58.  
  59. count++;
  60.  
  61. div.innerHTML=message+count+" times!";
  62.  
  63. };
  64.  
  65. };
  66.  
  67. </script>
  68.  
  69. </head>
  70.  
  71. <body>
  72.  
  73. <button id="clickme">Click me!</button>
  74.  
  75. <div id="message"></div>
  76.  
  77. </body>
  78.  
  79. </html>

JavaScript学习笔记(七)—— 再说函数的更多相关文章

  1. Go语言学习笔记七: 函数

    Go语言学习笔记七: 函数 Go语言有函数还有方法,神奇不.这有点像python了. 函数定义 func function_name( [parameter list] ) [return_types ...

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

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

  3. PHP学习笔记七【函数】

    <?php $a=13; function abc3($a) { unset($a);//[释放给定变量]表示不在abc3函数范围内,不在使用$a,后面需要全新定义 $a=45; } abc(3 ...

  4. 【Python】学习笔记七:函数

    函数的目的:重复使用相同的一段程序 函数的定义 下面是我自定义的一个求a,b,c三个参数平方和的函数 #a,b,c三个参数的平方和 def pow_sum(a,b,c): x = pow(a,2)+p ...

  5. Javascript学习笔记-基本概念-函数

    ECMAScript 中的函数使用function 关键字来声明,后跟一组参数以及函数体.函数的基本语法如下所示: function functionName(arg0, arg1,...,argN) ...

  6. javascript学习笔记(四) Number 数字类型

    数字格式化方法toFixed().toExponential().toPrecision(),三个方法都四舍五入 toFixed() 方法指定小数位个数  toExponential() 方法 用科学 ...

  7. (转)Qt Model/View 学习笔记 (七)——Delegate类

    Qt Model/View 学习笔记 (七) Delegate  类 概念 与MVC模式不同,model/view结构没有用于与用户交互的完全独立的组件.一般来讲, view负责把数据展示 给用户,也 ...

  8. Java程序猿的JavaScript学习笔记(8——jQuery选择器)

    计划按例如以下顺序完毕这篇笔记: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript ...

  9. Java程序猿JavaScript学习笔记(2——复制和继承财产)

    计划和完成在这个例子中,音符的以下序列: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaSc ...

  10. Java程序猿的JavaScript学习笔记(3——this/call/apply)

    计划按例如以下顺序完毕这篇笔记: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript ...

随机推荐

  1. python第十四课--排序及自定义函数之自定义函数(案例二)

    案例二: python中定义有/无返回值的函数,演示python没有函数重载这一说 需求:自定义函数:计算两个整数的和值两个原则:1).有没形参有,两个 2).有没返回值可有可无 def my_sum ...

  2. const修饰的成员是类成员,还是实例成员?

    很抱歉,我以为只有static修饰的成员是类成员,可以通过类名直接访问,然而,const 修饰的成员也属于类成员,直接通过类名访问,不能通过实例变量访问. 做维护久了,深刻的理解,扎实的基础对写出高质 ...

  3. 超简单,centos7安装docker

    1.在centos7上直接yum安装docker [root@localhost ~]# yum install docker 2.启动docker [root@localhost ~]#servic ...

  4. Java并发编程--2.synchronized

    前言 synchronized关键字是互斥锁,也称为内部锁 每个对象都有自己的monitor(锁标记),它是为了分配给线程,最多一个线程可以拥有对象的锁 使用 synchronized修饰成员方法,锁 ...

  5. virtualbox+vagrant学习-2(command cli)-4-vagrant global-status命令

    Global Status 格式: vagrant global-status 这个命令将告诉你当前登录的用户系统上所有活跃的vagrant环境的状态. userdeMacBook-Pro:~ use ...

  6. Selenium2+python-unittest之装饰器(@classmethod)

    原文地址:http://www.cnblogs.com/yoyoketang/p/6685416.html 前言 前面讲到unittest里面setUp可以在每次执行用例前执行,这样有效的减少了代码量 ...

  7. Linux下Meepops的搭建

    1.下载跟版本相对应的扩展 http://br.php.net/downloads.php 2.进入到pcntl目录 cd php-5.4.45/ext/pcntl 3.先执行phpize /usr/ ...

  8. bootstrap 多级下拉菜单

    如上效果: 实现代码: 导入js和css: <link rel="stylesheet" href="http://cdn.static.runoob.com/li ...

  9. 论文笔记 M. Saquib Sarfraz_Pose-Sensitive Embedding_re-ranking_2018_CVPR

    1. 摘要 作者使用一个pose-sensitive-embddding,把姿态的粗糙.精细信息结合在一起应用到模型中. 用一个新的re-ranking方法,不需要重新计算新的ranking列表,是一 ...

  10. Glide Golang包管理

    Golang的包管理乱得不行,各种工具横空出世,各显神通啊.用了几个下来,发现 Glide 是比较好用的,使用了 vender 来进行管理,多个开发环境的版本不冲突,功能强大,配置文件也足够简单. 初 ...