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

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

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

立即执行函数

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

复制代码代码如下所示:

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

(函数(){())

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 = { };
总结

你不必总结,仔细看看代码。
免责声明:本网信息来自于互联网,目的在于传递更多信息,并不代表本网赞同其观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,并请自行核实相关内容。本站不承担此类作品侵权行为的直接责任及连带责任。如若本网有任何内容侵犯您的权益,请及时联系我们,本站将会在24小时内处理完毕。
相关文章
返回顶部