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第十六课——外部函数and内部函数
1.外部函数&内部函数 内部函数: 定义在某个函数的内部,就是内部函数: [注意事项]: 1).内部函数可以随意使用它外部函数中的内容 2).外部函数不能使用内部函数中的内容 3).内部函数不 ...
- 起床困难综合症 NOI_2014_D1T1
这道题的正解其实没什么好说的,反而是部分分设计非常巧妙. 之所以要单开一篇是因为当时机房的部分同学刚学位运算,我拿这个题去讲想毒瘤大家一下,于是做了一个挺好看的课件. ppt -> pdf -& ...
- RAC with asm on AIX, ORA-01114 error,with "gipcretAuthFail (22) " in ocssd.log
I/O Errors in Alert log with ORA-29701, with "gipcWait failed with 16" in trace (文档 ID 149 ...
- 第二部分 OpenStack安装与配置
第二部分 OpenStack安装与配置 一.引言 本章内容讲解如何在3台物理机上搭建最小化云平台,这3台机器分为称为Server1.Server2和Client1,之后的各章也是如此.Server ...
- ajax跨域调用webservice例子
[WebMethod(Description = "这是一个描述")] public void GetTIM() { try { SqlDataAdapter da = new S ...
- Spring Cloud Eureka 学习记录
SpringCloud版本 <groupId>org.springframework.cloud</groupId> <artifactId>spring-clou ...
- 多线程之并发容器ConcurrentHashMap
这部分内容转载自: http://www.haogongju.net/art/2350374 JDK5中添加了新的concurrent包,相对同步容器而言,并发容器通过一些机制改进了并发性能.因为同步 ...
- Caused by: org.apache.velocity.exception.MethodInvocationException: Invocation of method 'getUser' in class org.uncommons.reportng.ReportMetadata threw exception class java.net.UnknownHostException :
Running TestSuite [TestNG] [WARN] Ignoring duplicate listener : org.uncommons.reportng.HTMLReporter ...
- JavaWeb基础—Servlet重要对象
一.ServletConfig对象 当servlet配置了初始化参数后(<init-param> <param-name> <param-value>),web容器 ...
- myeclipse(eclipse)IDE配置
1.更换JDK8 2.更换低版本的eclipse试试 其他方法暂时没想到 一.设置编码与字体 工作空间编码设置:window->perferences->General->words ...