JavaScript学习笔记(七)—— 再说函数
第八章 函数
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学习笔记(七)—— 再说函数的更多相关文章
- Go语言学习笔记七: 函数
Go语言学习笔记七: 函数 Go语言有函数还有方法,神奇不.这有点像python了. 函数定义 func function_name( [parameter list] ) [return_types ...
- JavaScript:学习笔记(5)——箭头函数=>以及实践
JavaScript:学习笔记(5)——箭头函数=>以及实践 ES6标准新增了一种新的函数:Arrow Function(箭头函数).本文参考的链接如下: MDN箭头函数:https://dev ...
- PHP学习笔记七【函数】
<?php $a=13; function abc3($a) { unset($a);//[释放给定变量]表示不在abc3函数范围内,不在使用$a,后面需要全新定义 $a=45; } abc(3 ...
- 【Python】学习笔记七:函数
函数的目的:重复使用相同的一段程序 函数的定义 下面是我自定义的一个求a,b,c三个参数平方和的函数 #a,b,c三个参数的平方和 def pow_sum(a,b,c): x = pow(a,2)+p ...
- Javascript学习笔记-基本概念-函数
ECMAScript 中的函数使用function 关键字来声明,后跟一组参数以及函数体.函数的基本语法如下所示: function functionName(arg0, arg1,...,argN) ...
- javascript学习笔记(四) Number 数字类型
数字格式化方法toFixed().toExponential().toPrecision(),三个方法都四舍五入 toFixed() 方法指定小数位个数 toExponential() 方法 用科学 ...
- (转)Qt Model/View 学习笔记 (七)——Delegate类
Qt Model/View 学习笔记 (七) Delegate 类 概念 与MVC模式不同,model/view结构没有用于与用户交互的完全独立的组件.一般来讲, view负责把数据展示 给用户,也 ...
- Java程序猿的JavaScript学习笔记(8——jQuery选择器)
计划按例如以下顺序完毕这篇笔记: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript ...
- Java程序猿JavaScript学习笔记(2——复制和继承财产)
计划和完成在这个例子中,音符的以下序列: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaSc ...
- Java程序猿的JavaScript学习笔记(3——this/call/apply)
计划按例如以下顺序完毕这篇笔记: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript ...
随机推荐
- python第十四课--排序及自定义函数之自定义函数(案例二)
案例二: python中定义有/无返回值的函数,演示python没有函数重载这一说 需求:自定义函数:计算两个整数的和值两个原则:1).有没形参有,两个 2).有没返回值可有可无 def my_sum ...
- const修饰的成员是类成员,还是实例成员?
很抱歉,我以为只有static修饰的成员是类成员,可以通过类名直接访问,然而,const 修饰的成员也属于类成员,直接通过类名访问,不能通过实例变量访问. 做维护久了,深刻的理解,扎实的基础对写出高质 ...
- 超简单,centos7安装docker
1.在centos7上直接yum安装docker [root@localhost ~]# yum install docker 2.启动docker [root@localhost ~]#servic ...
- Java并发编程--2.synchronized
前言 synchronized关键字是互斥锁,也称为内部锁 每个对象都有自己的monitor(锁标记),它是为了分配给线程,最多一个线程可以拥有对象的锁 使用 synchronized修饰成员方法,锁 ...
- virtualbox+vagrant学习-2(command cli)-4-vagrant global-status命令
Global Status 格式: vagrant global-status 这个命令将告诉你当前登录的用户系统上所有活跃的vagrant环境的状态. userdeMacBook-Pro:~ use ...
- Selenium2+python-unittest之装饰器(@classmethod)
原文地址:http://www.cnblogs.com/yoyoketang/p/6685416.html 前言 前面讲到unittest里面setUp可以在每次执行用例前执行,这样有效的减少了代码量 ...
- Linux下Meepops的搭建
1.下载跟版本相对应的扩展 http://br.php.net/downloads.php 2.进入到pcntl目录 cd php-5.4.45/ext/pcntl 3.先执行phpize /usr/ ...
- bootstrap 多级下拉菜单
如上效果: 实现代码: 导入js和css: <link rel="stylesheet" href="http://cdn.static.runoob.com/li ...
- 论文笔记 M. Saquib Sarfraz_Pose-Sensitive Embedding_re-ranking_2018_CVPR
1. 摘要 作者使用一个pose-sensitive-embddding,把姿态的粗糙.精细信息结合在一起应用到模型中. 用一个新的re-ranking方法,不需要重新计算新的ranking列表,是一 ...
- Glide Golang包管理
Golang的包管理乱得不行,各种工具横空出世,各显神通啊.用了几个下来,发现 Glide 是比较好用的,使用了 vender 来进行管理,多个开发环境的版本不冲突,功能强大,配置文件也足够简单. 初 ...