JavaScript学习笔记(七)—— 再说函数

第八章 函数

1 函数声明和函数表达式

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

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

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

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

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

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

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

例:

 1 

 

2函数是一个一等值

可以将函数赋给变量;

可以将函数传递给函数;

可以从函数返回函数;

例:

  1 
  2 
  3 
  4 
  5 
  6 
  7 First Class
  8 
  9 
 10 
 11 
 16 
 17 
258 
259 
260 
261 
262 
263  
264 
265 
266 
267 

 

3 数组的sort方法

  1 
  2 
  3 
  4 
  5 
  6 
  7 Drink PAIXU
  8 
  9 
 10 
 11 
 16 
 17 
170 
171 
172 
173 
174 
175 
176 
177 

 

3 匿名函数

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

如:

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

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

 

4 嵌套函数

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

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

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

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

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

 1 
 2 
 3 
 4 
 5 
 6 
 7 Bibao Counter
 8 
 9 
10 
11 
16 
17 
68 
69 
70 
71 
72 
73  
74 
75 
76 
77 

 

闭包案例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  
12 
13 var multBy3=multN(3);
14 
15 console.log("Multiplying 2:"+multBy3(2));
16 
17 console.log("Multiplying 4:"+multBy3(4));

 

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

 1 
 2 
 3 
 4 
 5 
 6 
 7 Click me!
 8 
 9 
10 
11 
16 
17 
72 
73 
74 
75 
76 
77 
78 
79 
80 81 82 83

 

你可能感兴趣的:(JavaScript学习笔记(七)—— 再说函数)