对Javascript系列(50)的深入理解:函数模型(下一部分) 浏览:41

介绍

本文介绍了初始化模式和性能模式,主要用于初始化和性能改进。有些模型以前已经提到过,但这里只是一个总结。

立即执行的函数。

我们在立即调用函数表达式系列中的第四部分中详细描述了类似的函数。这里我们只举两个简单的例子来总结。

复制代码代码如下所示:

在结束语句函数之后,函数立即执行。

(函数(){())

console.log(见证了!;

}();

此语句函数,也可以立即执行。

函数(){

console.log(见证了!;

(});

下面的方法可以是:

函数(代码);

-函数(代码);

+函数(代码);



立即执行的对象初始化

这种模式的意义是立即声明一个对象(而不是函数),并立即在对象初始化中执行一个方法,通常这种模式可以应用于一次执行的代码。

复制代码代码如下所示:

({

在这里您可以定义常量,设置另一个值。

最大:600,

最大高度:400,

当然,我们也可以定义实用工具方法。

gimmemax:函数(){

返回this.maxwidth +X+ this.maxheight;

},

初始化

init:函数(){

console.log(this.gimmemax());

更多代码…

}

(init)};这将初始化。



分支的初始化

分支初始化是初始化不同的条件(场景)来初始化不同的代码,也就是所谓的条件语句赋值。在我们做事件处理之前,我们通常使用以下代码:

复制代码代码如下所示:

VaR工具= { {

AddListener:功能(EL型,FN){

如果(typeof window.addeventlistener = 'function){

El.addEventListener(型、FN、假);

如果(typeof document.attachevent别的}!= = 'undefined){

El.attachEvent(开+型,FN);

{人}

埃尔{开+型} = FN;

}

},

RemoveListener:功能(EL型,FN){

}

};



让我们改进。首先,我们必须定义两个接口,一个用于添加事件句柄,另一个用于删除事件句柄。代码如下:

复制代码代码如下所示:

VaR工具= { {

AddListener:空,

RemoveListener:空

};



实现代码如下所示:

复制代码代码如下所示:

如果(typeof window.addeventlistener = 'function){

utils.addlistener =功能(EL型,FN){

El.addEventListener(型、FN、假);

};

如果(typeof document.attachevent别的}!= = 'undefined){ / /伊江

utils.addlistener =功能(EL型,FN){

El.attachEvent(开+型,FN);

};

utils.removelistener =功能(EL型,FN){

El.detachEvent(开+型,FN);

};

}其他旧浏览器

utils.addlistener =功能(EL型,FN){

埃尔{开+型} = FN;

};

utils.removelistener =功能(EL型,FN){

埃尔{开+型} = null;

};

}



使用它很方便吗代码也更加优雅。

自我声明函数

函数通常重写同一名称函数的代码,例如:

复制代码代码如下所示:

无功scareme =函数(){()

警报(嘘!;

scareme =函数(){

警报()!;

};

};



这段代码很容易混淆。让我们先看看示例的执行情况:

复制代码代码如下所示:

1。添加新属性

scareme.property =正确;

2。 / / scareme为新值

VaR的恶作剧= scareme;

三.调用方法

var = {

嘘:scareme

};

使用新的变量名

(恶作剧)!

(恶作剧)!

console.log(恶作剧性质); / /正确

使用方法调用

(幽灵,嘘)!

(幽灵,嘘)!

console.log(怪异。嘘。财产); / /正确



通过执行的结果,我们可以发现分配的功能和新的变量(或内部方法)不执行重负荷scareme码,而下面的例子是相反的。

复制代码代码如下所示:

使用自声明/函数

ScareMe(双); / /嘘!

ScareMe(双); / /嘘!

console.log(scareme。财产); / /未定义



当你使用这个模式时,你必须非常小心。否则,实际结果可能与您预期的不同。当然,您也可以使用这种特殊技术进行一些特殊操作。

内存优化

该模型主要利用函数的性质避免大量重复计算:

复制代码代码如下所示:

VaR MyFunc =函数(参数){

如果(!MyFunc。{ }){缓存参数

var结果{ };

复杂操作…

MyFunc。{ } =结果缓存参数;

}

返回MyFunc。缓存参数} {;

};

高速缓存

myfunc.cache = { };



但是,上面的代码有一个问题。如果参数是字符串或其他一些常见的方法类似于对象,会有问题。在这个时候,我们需要使用传说中的hasownproperty方法。代码如下:

复制代码代码如下所示:

VaR MyFunc =函数(参数){

如果(!MyFunc.cache.hasOwnProperty (param)) {

var结果{ };

复杂操作…

MyFunc。{ } =结果缓存参数;

}

返回MyFunc。缓存参数} {;

};

高速缓存

myfunc.cache = { };



如果你输入的参数很多,你可以生成这些参数通过JSON的stringify法生产用于存储缓存的密钥值。代码如下:

复制代码代码如下所示:

VaR MyFunc =函数(){()

VaR缓存的密钥= json.stringify(array.prototype.slice.call(参数)),

结果;

如果(!MyFunc。缓存缓存的密钥){ } {

结果= { };

复杂操作…

MyFunc { } =结果缓存缓存的密钥;

}

返回MyFunc。缓存缓存的密钥} {;

};

高速缓存

myfunc.cache = { };



或多个参数,也可以使用arguments.callee特征:

复制代码代码如下所示:

VaR MyFunc =函数(参数){

var = arguments.callee,

结果;

如果(!f.cache {参数}){

结果= { };

复杂操作…

f.cache { } =结果参数;

}

返回参数f.cache { };

};

高速缓存

myfunc.cache = { };



总结

你不必总结,仔细看看代码。
推荐文章1
广告