Javascript模式(第四章函数)------读书笔记

时间:2023-03-09 05:20:46
Javascript模式(第四章函数)------读书笔记

一 背景

js函数的两个特点:1 函数是第一类对象(first-class object);2 函数可以提供作用域

  1 函数是对象:

    1 函数可以在运行时动态创建,还可以在程序执行过程中创建

    2 可以被赋值给变量,还可以被删除

    3 可以作为参数传递给别的函数,可以作为返回值,被别的函数返回,

    4 可以拥有自己的属性和方法

  2 由于JS没有块级作用域的概念,因此在涉及到控制变量作用域的时候,函数是必不可少的工具

  1.1 消除术语歧义:我们来看一下命名函数表达式、你们函数表达式以及函数声明的定义

    1 一般的函数表达式即为匿名函数表达式,简称匿名函数,即var add=function(){};

    2 命名函数表达式:var add1=function add(){};

    3 命名函数表达式是函数表达式的一种特殊情况,命名函数表达式与函数表达式的区别在于:其name属性

    4 函数声明:function add(){}

var add1=function add(){};//命名函数表达式
console.log(add1.name);//add //函数表达式/匿名函数表达式/匿名函数
var add2=function (){};
console.log(add2.name);//"" //函数声明
function add3(){}
console.log(add3.name);//add3

  1.2 声明VS表达式:名称与变量声明提升

  函数声明只能出现在“程序代码”中,即函数声明只能存在于其他函数体内或者全局空间中,它们不能分配给变量或者某个属性,也不能作为参数出现在函数调用中

//命名函数表达式
callMe(function me(){
}); //匿名函数表达式
callMe(function(){
}); //函数表达式
var obj={
say:function(){
}
};

  1.3 函数的name属性

  函数的name属性是只读的

  name属性的用途:调试代码的时候,可以根据name属性作为一个标识符;可以用于自身的递归运算

  1.4、函数的提升

  虽然函数声明与函数命名表达式很相似,但是二者之间还是有很大区别的,这个区别就是函数的提升

  我们知道对于所有变量,无论是在函数体的何处进行的声明,都会在后台被提升到函数的顶部,函数声明也一样,无论函数声明在何处,都会被提升到顶部,

  而函数表达式不会得到提升,下面我们来看一个例子

var name="Jim";
fun();//函数声明!
var fun=function(){
alert("函数表达式!");
}
fun();//函数表达式!
function fun(){
alert("函数声明!");
}
fun();//函数表达式!
aaarticlea/jpeg;base64,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*C2kW4D2sO9jmKApGehXGBUWm/syfD7SPBNp4TtbDVxollcR3NgkniLUpLjTpI02IbS4a4M1qAhZcQugKswIwzZT1f3C2WndnEwftQ+KtW13StC0j4e2M2uXMOrR3cF94gaCGzvNOmhS5QyraSb4WWdGjlC7mLKHjjySvtfw/wDGlr8RfAvhzxTYwzW9nren2+oxQzgCSNJY1kCt2yAwB/GuStP2cfAOmXmjXdlpmoWFxpFnd2No9rrd/D+7usm5aQLMPNllYh2mk3SF1Vy25VI63wJ4J0f4a+ENL8L+H4ZrXRdMhFvZ29xdzXTxRj7qeZK7uVUEAAsQoAAwAAKurMLbHlfj+6+Kev8Ax40jw94f1KDQPCNrZR395c2WqQJd3UbTKj74bjS7kHbtYKiSxFgxJkU4C7el/F7xHqFz4bik8L6XCmqaxq2h3DLrcjtb3Fp9qMTIDajzI5BZtuJKFN64WTk1vX3wY8N6l8QI/Gss2vpr0flgNb+JdShtdqEFYzapcCApkAlDHtY5JBJNZt5+zp4Eu/GMfimWw1GPWobyS/gmg16/hjt55EZZmhhScRxeaGbzAiqJDy4Y4IzWisitL3ZmfBz4zeJ/iDd6ZF4m8G2PhZNY0ubVdNax1ptQLxwyxRyiYNbQ+Wczwsm0vuVju2EbTkx+NvGni/wp8atV0XVY9LutGvLrTPDsE9vE0cMtnCpeSUkEuJZi4IP3UVduGyTzmheJvg78Mbzw9qttp/xL046NbnRtOk1LSPFc0KpczgCEpPGySNJK0arvDMSIlX7kYHSeNvBOi+EtH+IWjN40TwzF8RblDBbrbeZc2lzdNb6fPLCqtuYPJPajcQFikmDMcNgerSpOn/Eg9bWun0av+Bk/U2vHPxjex/Ze1H4k6e8WnXk/hn+1LBboqQlzLAGt4+eGJkdFC9WJAHJr07w5b3FnoOnwXd7PqVzFbxpJeXSoss7BQC7iNEQMTkkKigE8KBxXmeqjwJ8QvgX4v8J6X4itLLwnZaM2jXWqwyg21jbvp8UySrM2EeMW1xDIHDFcHlsg4q6N+1P8JdNg0nSNT+Lvgi71VrIyTXdnqkENq7R+WshBMzrFkyArG8hYqGwX2ORDoupGSowbs29m9LaAnZK7PaKK8i1z9qX4baFFLcf29caxp8Onf2rNqXh7S7zVrKG08yaMzSXFpDJEih7a4B3MMeU+cYrR0f8AaB8Ha54st/Dtpc6ub+51C60mCebQb+Kznu7YTGeGO7eAQOy/Zp/uyHPlNjOKyeFrqPNyO3oyuZdz0yisjQPFGj+KBqH9j6vY6t/Z15Jp959huUm+zXMePMhk2k7JFyMo2CMjIrVJrmknF2krFbjqKYxxjr1petTcB1FJQKYj5N/bI/5Lr+zb/wBjIf8A0qsK+s6+TP2yP+S6/s2/9jIf/Sqwr6zrysL/AL1iPWP/AKSj9Bz3/kQ5N/grf+n5hRRRXqn5+FFFFABRRRQAUUUUAFFFFAHl37Tf/JD/ABJ/27f+lMVeDfsaf8lP1T/sDy/+j4K95/ab/wCSH+JP+3b/ANKYq8G/Y0/5Kfqn/YHl/wDR8Ffp+Uf8kxjP8T/KB+dZp/yUWF9F+cj6k8XfE/wb8P7zTbTxR4t0Pw3dam5jsYNX1KG1e7YFQViWRgXOWUYXP3h6iumr528RWfh1/wBrC2vb21+IgvF0+2t47nTofEQ0c3XmhkR3gH2Mx7CpcOfKzu3/ADbqw7PWbzQvHvhbQrzT/ibPJpniTWoL+/SLWbmw/s24S8e0DzAslxy9rskXzDAY9paE4B/L4+9TUurv+Dsvv0fo0z9HatJrorfjHmb9OnqfUtZV74s0TTWv1u9Z0+1bT1ie8E10iG2WQkRmTJ+QOQQpOM4OM185/s2yXnh/X/BltLcfEq9fXPDt5Pq*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yOeuM9634fD2m2mpW19BZQwXVvaGxikiTZtgyrCPA42gqMf3ecY3GtNenFADqKKKACiiigAooooAKKKKACiiigArivhD41vvH/hS/wBT1CK3huIPEGuaUq2ysqmKz1W6s4mIZidxjt0LHOCxYgAYA7WvKv2af+Sdav8A9jn4s/8AUh1GgD1WiiigAooooAKKKKAMvxP4Y0zxlodzo+sW32zTrnb5sPmMm7awZfmUgj5lB4PasDwZ8HvCHw+1SXUdA0j7BeSwm3eT7TNJmMsrEYdyOqrzjPFdnRXVDFYinSdCFRqD3Sbs/VbM5p4ahUqKtOCc1s2ldej3CiiiuU6QrKvfCeiak1+13o2n3TagsSXhmtUc3KxkmMSZHzhCSVBzjJxitWiqUnHZgFFFFSAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABXP33gPQtS8XWPii5sfM12yhMFvdedINiHeMbA20/6x+SCefYV0FFaQqTp3cG1dW07Pp6Gc6cKiSmk7a69xNo9KMD0paKzNBMUYHpS0UAJgUtFFACYoAxS0UAJijFLRQAmKMUtFACUYpaKAEwPSloooAKKKKACiiigAooooAKKKKACiiigArivhD4KvvAHhS/0zUJbea4n8Qa5qqtbMzKIrzVbq8iUllB3CO4QMMYDBgCRgntaKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAP/Z" alt="" />

二 回调模式

  2.1 回调模式:将函数A作为参数传递给函数B,且A在函数B中得到执行,那么函数A就被称之为回调函数,该模式称之为回调模式

function A(){
console.log("I am a callback !");
}
function B(callback){
if(typeof callback!=="function"){
callback=false;
}
if(callback){
callback();
}
}
B(A);//I am a callback !

  2.2 回调示例

  假设我们需要抓取页面上的DOM树,并返回相应的DOM数组,对该数组里的DOM进行操作,例如隐藏

  根据函数的通用性,一个函数是找到相应的DOM,并返回数组(findNodes),另外一个函数是隐藏功能(hide)

  先执行findNodes,然后获取到返回的DOM数组,再进行for循环进行遍历,隐藏,效率有些低下,我们采取回调模式

  

var findNodes(callback){
var nodes=[],found;
if(typeof callback!="function"){
callback=false;
}
while(条件为true){
find;//......查找相关节点的操作
if(callback){
callback(found);
}
}
return nodes;
};
findNodes(hide);

  2.3、回调模式与作用域

问题:在某些情况下,我们的回调函数不是一次性的匿名函数也不是全局函数,而是某个对象的方法,如果在该方法中使用了this来引用它所属的对象,将会出现以下问题

color="black";
//自定义对象myapp
var myapp={
color:"red",
paint:function(arg){
arg=this.color;
//将myapp的color赋值给参数的color属性
console.log(arg);
}
}; function B(callback){
if(typeof callback!=="function"){
callback=false;
}
var B_color={};
if(callback){
callback(B_color);
}
}
B(myapp.paint);//black
//由于B函数是一个全局函数,因此,对象中的this指向全局对象window,而不是预期的myapp

解决方案:将回调函数及其所属对象一并传递给函数B

color="black";
var myapp={
color:"red",
paint:function(arg){
arg=this.color;
console.log(arg);
}
};
//将回调函数callback与回调函数所属的对象一并传递进去
function B(callback,callback_obj){
var B_color;
if(typeof callback==="function"){
callback.call(callback_obj,B_color);
//注意,这里不再只是单纯的直接调用回调函数,而是回调函数所属的对象对回调函数加以调用
}
} B(myapp.paint,myapp);//red

进一步优化方案:由上面可以看出,在调用myapp的paint方法时,需要输入两次对象名myapp,我们可以对其进行如下优化,将该方法作为字符串来传递,无需两次输入该对象的名称

function B(callback,callback_obj){
var B_name={};
if(typeof callback==="string"){
callback=callback_obj[callback];
}
if(typeof callback==="function"){
callback.call(callback_obj,B_name);
}
}
B("paint",myapp);//red

六、回调函数的用途

  1 异步事件监听器

  例如:给页面元素提供一个回调函数的指针,使得当该事件触发时可以得到调用,该模式支持异步方式,即允许以乱序的方式运行

  2  超时调用

  当使用window提供的超时方法:setTimeout和setInterval中的参数是一个函数指针,也使用了回调模式,在某一个时刻触发

3  JS库中回调模式的应用

  在设计JS库的时候,回调模式可以帮助JS库实现通用性,使开发者不必预测和实现每一个功能

  因为一方面过多的功能会使JS库过于庞大,另一方面,有些功能可以绝大多数用户永远也不会使用到。

  因此在开发js库的时候:专注于核心功能的开发,提供“挂钩”形式的回调函数,使得JS库可以很容易的扩展。

三 返回函数:函数是一个对象,因此可以作为返回值

  1   应用场景:一个函数执行一部分工作,这些工作可能包含一些一次性的初始化,后续调用它的时候,是其返回值,其返回值也是一个函数,后续操作就由其返回函数来执行

function init(){
console.log(1);
return function(){
console.log(2);
};
};
var s=init();//1
s();//2

注意:init函数返回了一个匿名函数,即创建了一个闭包,(这里提到闭包的一个作用:创建私有数据,只有该匿名函数可以访问,外部代码不能访问),下面我们来看一下对该特点的应用

function init(){
var count=0;
return function(){
return count+=1;
};
};
var s=init();
console.log(s());//1
console.log(s());//2
console.log(s());//3

四 自定义函数(惰性函数模式):一个函数有一些初始化的准备工作,且只需要执行一次,使用自定义函数模式可以使重新定义的函数执行更少的工作

function init(){
console.log("Boo!");
init=function(){
console.log("Boo Boo!");
};
};
init();//Boo!
init();//Boo Boo!
init();//Boo Boo!

  2   该模式又被称为惰性函数模式,即该函数直到第一次使用才会被正确定义,并且具有后向惰性,即得到正确定义后,会执行更少的工作  

  3   该模式的缺陷:当它重新定义自身时已经添加到原函数的任何属性都会丢失,如果再将其赋值给其他变量,那么使用新的变量来调用该函数的话,重定义的部分永远也得不到执行

var a,b;
a=b=function(){
console.log("1");
b=function(){
console.log("2");
}
};
b.age=18;
a();//
a();//
b();//
b();//
console.log(b.age);//undefined

五 即时函数:函数创建后立即执行该函数的语法

1  该模式的实现方法:使用函数表达式定义一个函数;在该函数表达式末尾加一组括号,让其立即执行;将这个包装到括号中

(function(){
console.log("Oops!");
})();

  2   应用场景:该模式提供了一个作用域沙箱,当页面加载时,代码必须执行一些设置任务,例如设置事件监听器、创建对象等,但这些工作只需要执行一次,因此没有 必要定义一个可复用的函数,如果写在全局作用域下,有可能初始化操作还需要一些临时变量,这些变量可能会污染全局作用域,因此我们可以使用即时函数模式, 将所有临时变量包装到它的局部作用域中

(function(){
var days=['星期日','星期一','星期二','星期三','星期四','星期五','星期六'],
today=new Date(),
msg="今天"+days[today.getDay()];//这里days,today以及msg都是临时变量
console.log(msg);// 今天星期五
})();

  5.1 即时函数的参数:这里不建议过多的参数传递给即时函数,避免造成阅读负担

(function(who,when){
var days=['星期日','星期一','星期二','星期三','星期四','星期五','星期六'];
console.log("我在"+days[when.getDay()]+"遇见了"+who);
})("我的偶像",new Date());//我在星期五遇见了我的偶像

  4    另外,应该注意全局对象也可以作为参数传递给即时函数,为了使代码可以在浏览器之外的环境有更好的互操作性,这里不建议在即时函数内部使用window

(function(global){
//通过global访问全局变量
})(this);

  5.2 即时函数的返回值

var dd=(function(){
var count=0;
return function(){
count++;
console.log(count);
};
})();
dd();//
dd();//
dd();//
console.log(count);//ReferenceError: count is not defined

  5.3 优点和用法

  不会污染全局空间,用于书签工具,因为书签工具可以在任何网页上运行,并保持全局命名空间的整洁;确保页面在存在或不存在该代码的两种情况下都能良好运行

六 即时函数对象化

  1 保护全局作用域不被污染的方法,除了上面的即时执行函数,还有即时对象初始化模式

  2 该模式的init方法在创建对象后将会立即执行,init方法负责所有的初始化任务

  3 缺点:js压缩不能有效的缩减代码

({
max:600,
min:400,
getMax:function(){
return this.max;
},
init:function(){
console.log(this.getMax());
return this;//如果想保存对该对象的一个引用,可以返回this
}
}).init();

七 初始化时分支:加载时分支

当知道某个条件在整个程序的生命周期内是不会发生改变的时候,仅对该条件进行一次测试即可,例如浏览器嗅探(浏览器版本的检测)等

第一个demo,我们在使用utils.addListener()函数的时候,每次调用该函数都需要去typeof window.addEventListener....

但是第二个demo,我们在使用utils.addListener()函数的时候,我们只需要进行一次到底是window.addEventListener还是document.attachEvent还是el["on"+type]

/*每次调用utils.addListener方法给dom元素绑定事件的时候,都需要对其进行检测
typeof window.addEventListener
typeof document.attachEvent
*/
var utils={
addListener:function(el,type,fn){
if(typeof window.addEventListener==="function"){
el.addEventListener(type,fn,false);
}else if(typeof document.attachEvent==="function"){
el.attachEvent('on'+type,fn);
}else{
el["on"+type]=fn;
}
}
};
/*
typeof window.addEventListener
typeof document.attachEvent
只需要执行一次就可以了
*/
var utils={
addListener:null
};
if(typeof window.addEventListener==="function"){
utils.addListener=function(el,type,fn){
el.addEventListener(type,fn,false);
};
}else if(typeof document.attachEvent==="function"){
utils.addListener=function(el,type,fn){
el.attachEvent('on'+type,fn);
}
}else{
utils.addListener=function(el,type,fn){
el["on"+type]=fn;
}
}

八 函数属性---备忘模式

  1 函数是对象,因此可以拥有属性,使用任何语法定义的函数都会自动获取一个length的属性,该属性是函数期望的参数的数量

  2 自定义一个属性,用来缓存函数的结果,下次调用函数的话就不需要做潜在的繁重的计算了,这种缓存函数就诶过的方式称之为备忘

  3 但是如果有两个名称一致,但是值不一致的话,就会得不到想要的结果

var fun=function(param){
if(!fun.cache[param]){
var result={};
//...计算
fun.cache[param]=result;
}
return fun.cache[param];
}
fun.cache={};

九 配置对象

随着需求的不断变化,我们所需要的参数可能不断增多,这样我们向构造函数传递的参数也越来越多,参数会越来越长,实参与形参的顺序,也必须保持一致

例如addPerson(firstName,lastName,age,gender,address,telphone,birthday,.......);

配置对象模式

addPerson(conf);
conf={
firstName:"...",
lastName:"...",
age:"...",
gender:"...",
address:"...",
telphone:"...",
birthday:"..."
};
/*优点:
不需要记住众多参数及其顺序,
可以忽略可选参数
易于阅读和维护
易于添加和删除
缺点:
需要记住参数的名称
属性名称不能压缩
*/

十 curry

  什么是curry,术语:一个转换过程,即我们执行函数转换的过程

  当我们调用某一个函数的时候,发现多个调用函数的参数大部分都一致,我们想这些函数只执行一遍,执行其中相同的一部分,然后再各自执行剩余的部分

  例如add(1,2,3,4,5,6,10);add(1,2,3,4,5,6,100);add(1,2,3,4,5,6,1000);add(1,2,3,4,5,6,10000),其中前面的6个参数都是一致的,这种情况下,我们先执行add(1,2,3,4,5,6),然后再各自与add(1,2,3,4,5,6)相加

function add(a,b,c,d,e,f,g){
return a+b+c+d+e+f+g;
}
add(1,2,3,4,5,6,10);
add(1,2,3,4,5,6,100);
add(1,2,3,4,5,6,1000);
add(1,2,3,4,5,6,10000); /*下面只是一个示意图或者说我们想要的一个效果图,
并不是真正的要这样计算 */
var newAdd=add(1,2,3,4,5,6);
newAdd(10);
newAdd(100);
newAdd(1000);
newAdd(10000);

   10.1  Curry化

/*特殊函数的curry化*/
function add(x,y){
if(typeof y==="undefined"){
return function(y){
return x+y;
};
}
return x+y;
}
var newAdd=add(1);
var result=newAdd(2);
console.log(result);//

 

/*特殊函数的curry化*/
function add(a,b,c,d,e,f,g){
return a+b+c+d+e+f+g;
} /*下面是通用的curry化*/
function schonfinkelize(fn){
var slice=Array.prototype.slice,
stored_args=slice.call(arguments,1);
return function(){
var new_args=slice.call(arguments),
args=stored_args.concat(new_args);
return fn.apply(null,args);
};
}
var newAdd=schonfinkelize(add,1,2,3,4,5,6);
console.log(newAdd(10));//
console.log(newAdd(100));//
console.log(newAdd(1000));//
console.log(newAdd(10000));//

 10.2 何时使用Curry化

当发现正在调用同一个函数,且传递的参数大多数是相同的,那么这个函数可能用于Curry化。可以通过将一个函数参数部分应用到函数中,从而动态的创建一个新函数,这个新函数将会保存重复的参数,因此不必每次都传递这些重复的参数