第八章 函数

1 函数声明和函数表达式

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

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

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

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

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

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

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

例:

 <script language="JavaScript" type="text/JavaScript">

 var migrating=true;

 //函数表达式

 var fly=function(num){

 for(var i=0;i<num;i++)

 {

 console.log("Flying!");

 }

 };

 //函数声明

 function quack(num){

 for(var i=0;i<num;i++)

 {

 console.log("Quack!");

 }

 }

 //调用

 if(migrating)

 {

 var superquack=quack;//创建变量实现再引用

 superquack(2);

 var superfly=fly;

 superfly(3);

 //quack(4);

 //fly(3);

 }

 </script>

2函数是一个一等值

可以将函数赋给变量;

可以将函数传递给函数;

可以从函数返回函数;

例:

 <!doctype html>

 <html lang="en">

 <head>

 <title>First Class</title>

 <meta charset="utf-8">

 <style type="text/css">

 </style>

 <script language="JavaScript" type="text/JavaScript">

 //表示乘客的数据结构

 var passenger=[{name:"Jane Doloop",paid:true,ticket:"coach"},

 {name:"Dr.Evel",paid:true,ticket:"firstclass"},

 {name:"Sue proprty",paid:false,ticket:"firstclass"},

 {name:"John Funcall",paid:true,ticket:"coach"}

 ];

 //方法一:传统分步检验函数

 /*

 //检查是否买票

 function checkPaid(passenger){

 for(var i=0;i<passenger.length;i++)

 if(!passenger[i].paid)

 {

 console.log("The plane can't take off:"+passenger[i].name+" hasn't paid!");

 return false;

 }

 return true;

 }

 //检查是否乘客在禁飞名单

 function checkNoFly(passenger){

 for(var i=0;i<passenger.length;i++)

 if(passenger[i].name=="Dr.Evel")

 {

 console.log("The plane can't take off:"+passenger[i].name+" is on the no-fly-list!");

 return false;

 }

 return true;

 }

 //打印乘客姓名

 function printPassenger(passenger){

 for(var i=0;i<passenger.length;i++){

 console.log(passenger[i].name)

 }

 }

 //主调函数

 printPassenger(passenger);

 if(checkPaid(passenger))

 {

 if(checkNoFly(passenger))

 console.log("The plane could take off!");

 }

 */

 //方法二:传递函数简化代码

 //迭代乘客

 function processPassenger(passenger,testFunction)

 {

 for(var i=0;i<passenger.length;i++)

 if(testFunction(passenger[i]))

 return false;

 return true;

 }

 //打印乘客名单

 function printPassenger(passenger)

 {

 var ifpaid;

 if(passenger.paid)

 ifpaid="已";

 else

 ifpaid="未";

 console.log(passenger.name+"      "+ifpaid+"购票");

 }

 //禁飞名单检测

 function checkNoFlyList(passenger)

 {

 return (passenger.name==="Dr.Evel");

 }

 //检查乘客是否已买票

 function checkNotpaid(passenger)

 {

 return (!passenger.paid);

 }

 //打印乘客名单

 processPassenger(passenger,printPassenger);

 //向函数传递函数

 var allCanFly=processPassenger(passenger,checkNoFlyList);

 if(!allCanFly)

 console.log("The plane can't take off:we have a passenger on the no-fly-list!");

 var allPaid=processPassenger(passenger,checkNotpaid)

 if(!allPaid)

 console.log("The plane can't take off:not everyone has paid!");

 //乘客点饮料

 function createDrinkOrder(passenger)

 {

 var orderFunction;//创建一个变量用于存储要返回的函数

 if (passenger.ticket==="firstclass")

 {

 orderFunction=function(){

 alert("Would you like a cocktail or wine?");

 };

 }else{

 orderFunction=function(){

 alert("Your choice is cola or water.");

 };

 }

 return orderFunction;//返回函数

 }

 //提供服务的函数

 function serverCustomer(passenger)

 {

 var getDrinkOrderFunction=createDrinkOrder(passenger);//获取返回函数

 getDrinkOrderFunction();//调用函数

 //让乘客点餐

 //getDrinkOrderFunction();

 //播放电影

 //getDrinkOrderFunction();

 //清理垃圾

 //getDrinkOrderFunction();

 }

 //顾客调用服务

 function serverPassenger(passenger)

 {

 for(var i=0;i<passenger.length;i++)

 {

 serverCustomer(passenger[i]);

 }

 }

 serverPassenger(passenger);

 </script>

 </head>

 <body>

 </body>

 </html>

3 数组的sort方法

 <!doctype html>

 <html lang="en">

 <head>

 <title>Drink PAIXU</title>

 <meta charset="utf-8">

 <style type="text/css">

 </style>

 <script language="JavaScript" type="text/JavaScript">

 var products=[{name:"Grapefruit",calories:170,color:"red",sold:8200},

 {name:"Orange",calories:160,color:"orange",sold:12101},

 {name:"Cola",calories:210,color:"caramel",sold:25412},

 {name:"Diet",calories:0,color:"caramel",sold:43922},

 {name:"Lemon",calories:200,color:"clear",sold:14983},

 {name:"Raspberry",calories:180,color:"pink",sold:9427},

 {name:"Root Beer",calories:200,color:"caramel",sold:9909},

 {name:"Water",calories:0,color:"clear",sold:62123},

 ];

 // sort and display the scores

 console.log("\n------- sorting by sold -------");

 products.sort(compareSold);

 printProducts(products);

 console.log("\n------- sorting by name -------");

 products.sort(compareName);

 printProducts(products);

 console.log("\n------- sorting by calories -------");

 products.sort(compareCalories);

 printProducts(products);

 console.log("\n------- sorting by color -------");

 products.sort(compareColor);

 printProducts(products);

 function compareName(colaA, colaB) {

 if (colaA.name > colaB.name) {

 return 1;

 } else if (colaA.name === colaB.name) {

 return 0;

 } else {

 return -1;

 }

 }

 function compareCalories(colaA, colaB) {

 if (colaA.calories > colaB.calories) {

 return 1;

 } else if (colaA.calories === colaB.calories) {

 return 0;

 } else {

 return -1;

 }

 }

 function compareColor(colaA, colaB) {

 if (colaA.color > colaB.color) {

 return 1;

 } else if (colaA.color === colaB.color) {

 return 0;

 } else {

 return -1;

 }

 }

 function compareSold(colaA, colaB) {

 if (colaA.sold > colaB.sold) {

 return 1;

 } else if (colaA.sold === colaB.sold) {

 return 0;

 } else {

 return -1;

 }

 }

 //打印函数

 function printProducts(products) {

 for (var i = 0; i < products.length; i++) {

 console.log("Name: " + products[i].name +

 ", Calories: " + products[i].calories +

 ", Color: " + products[i].color +

 ", Sold: " + products[i].sold);

 }

 }

 </script>

 </head>

 <body>

 </body>

 </html>

3 匿名函数

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

如:

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

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

4 嵌套函数

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

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

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

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

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

 <!doctype html>

 <html lang="en">

 <head>

 <title>Bibao Counter</title>

 <meta charset="utf-8">

 <style type="text/css">

 </style>

 <script language="JavaScript" type="text/JavaScript">

 //原来

 var count=0;

 function counter(){

 count=count+1;

 return count;

 }

 console.log(counter());

 console.log(counter());

 console.log(counter());

 //使用闭包

 function makeCounter(){

 var count=0;

 function counter(){

 count=count+1;

 return count;

 }

 return counter;

 }

 var doCount=makeCounter();//调用makeCounter()获得闭包(函数及其环境)

 console.log(doCount());//除了调用doCount没有其他办法访问count

 console.log(doCount());

 console.log(doCount());

 </script>

 </head>

 <body>

 </body>

 </html>

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

 function makeTimer(doneMessage,n){

 setTimeout(function(){alert(doneMessage);},n);

 }

 makeTimer("Cookies are done!",1000);

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

 function makeCounter(){

 var count=0;

 return {//返回对象

 increment:function(){//对象方法

 count++;

 return count;

 }

 };

 }

 var counter=makeCounter();

 console.log(counter.increment());//调用对象方法

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

 function multN(n){

 return function multBy(m){

 return n*m;

 };

 }

 var multBy3=multN(3);

 console.log("Multiplying 2:"+multBy3(2));

 console.log("Multiplying 4:"+multBy3(4));

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

 <!doctype html>

 <html lang="en">

 <head>

 <title>Click me!</title>

 <meta charset="utf-8">

 <style type="text/css">

 </style>

 <script language="JavaScript" type="text/JavaScript">

 //不使用闭包

 /*

 var count=0;

 window.onload=function(){

 var button=document.getElementById("clickme");

 button.onclick=handleClick;

 };

 function handleClick(){

 var message="You clicked me ";

 var div=document.getElementById("message");

 count++;

 div.innerHTML=message+count+" times!";

 }

 */

 //使用闭包

 window.onload=function(){

 var count=0;

 var message="You clicked me ";

 var div=document.getElementById("message");

 var button=document.getElementById("clickme");

 button.onclick=function(){

 count++;

 div.innerHTML=message+count+" times!";

 };

 };

 </script>

 </head>

 <body>

 <button id="clickme">Click me!</button>

 <div id="message"></div>

 </body>

 </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. [JSOI2016]扭动的回文串

    题目 非常板子了 看到求什么最长的回文,我们就想到枚举回文中心的方法 首先对于这个回文串只包含在一个串内的情况,我们随便一搞就可以了,大概\(Manacher\)一下就没有了 对于那种扭动的回文串,我 ...

  2. numpy的array数据类型(创建)

    import numpy as np # 创建 # 创建一维数组 a = np.array([1, 2, 3]) print(a) ''' [1 2 3] ''' # 创建多维数组 b = np.ar ...

  3. 最简单的方式在linux上升级node.js版本

    node的升级频率太高,n模块来升级是最方便的,网上看了很多资料介绍使用n模块,但是安装n模块之后却经常找不到这个命令  很多同学安装之后直接去使用n会发现命令不存在,就停留在这一步无法前进了. 解决 ...

  4. django 模板关闭自动转义

    Django的模板中会对HTML标签和JS等语法标签进行自动转义,原因显而易见,这样是为了安全.但是有的时候我们可能不希望这些HTML元素被转义,比如我们做一个内容管理系统,后台添加的文章中是经过修饰 ...

  5. 数字电路中应避免产生不必要的锁存器 Latch

    锁存器(Latch)是数字逻辑电路中很重要的一种基本电路,常见的锁存器包括三个端口:数据输入口.数据输出口.使能端.当使能端为高电平时,输入口的数据直接送到输出口,此时输入输出口可以看成是直接连通的: ...

  6. 构建 CDN 分发网络架构

    cdn基本架构: CDN的基本目的:1.通过本地缓存实现网站的访问速度的提升 CDN的关键点:CNAME在域名解析:split智能分发,引流到最近缓存节点

  7. ra寄存器定位core

    $ra寄存器中存入的是pc的值(程序运行处的地址),调用函数时,在跳转前,必须保存当前地址(pc的值),以便后来返回.jal $ra 保存后跳转,jr $ra,返回到跳转前,通过$ra保存进入上层栈地 ...

  8. 【html】点击链接让页面在 iframe 中变换

    Demo: <html><body> <a href= "1.html " target= "iFrameName "> p ...

  9. 【OC底层】KVO原理

    KVO的原理是什么?底层是如何实现的? KVO是Key-value observing的缩写. KVO是Objective-C是使用观察者设计模式实现的. Apple使用了isa混写(isa-swiz ...

  10. 用C挑战无准备写2048

    下午在刷题过程中,忽然想写2048了,以弥补以前写的那个千多行的,所以简单思考了一下准备采取的数据结构就开始了,本以为一个小时能搞定,结果后面改bug还是多花了些时间.因为在医院,所以声音不敢太大,如 ...