第八章 函数
1 函数声明和函数表达式
差别一:函数声明:函数在执行代码前被创建;函数表达式是在运行阶段执行代码时创建;
差别二:函数声明创建一个与函数同名的变量,并让她指向函数;使用函数表达式,不给函数指定名称,
因此要么在代码中将函数赋给一个变量,要么以其他方式使用函数表达式;
差别三:函数声明不返回指向函数的引用;而是创建一个与函数同名的变量,并将指向函数的引用赋给它;函数表达式返回一个引用,该引用指向函数表达式创建的函数;
差别四:函数声明是完整的语句,而函数表达式是语句的一部分;
共同一:函数都可以被看做引用,函数引用是一个指向函数的值;quack函数存储在同名变量quack;fly显式存储;可以在变量中存储指向函数的引用;
共同二:可以用相同的方式处理调用他们的语句
例:
1
2函数是一个一等值
可以将函数赋给变量;
可以将函数传递给函数;
可以从函数返回函数;
例:
1 2 3 4 5 6 7First 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 7Drink 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 7Bibao 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 7Click me! 8 9 10 11 16 17 72 73 74 75 76 77 78 79 80 81 82 83