在做了一些关于这个主题的研究之后,我一直在尝试很多模式来组织我的jQuery代码(例如Rebecca Murphy在jQuery Conference上做了一个presentation的例子)。jQuery的代码组织和性能
昨天我检查了(揭示)模块模式。结果看起来有点让人想起YUI语法我想:
//global namespace MyNameSpace
if(typeof MNS=="undefined"||!MNS){var MNS={};}
//obfuscate module, just serving as a very simple example
MNS.obfuscate = function(){
//function to create an email address from obfuscated '@'
var email = function(){
$('span.email').each(function(){
var emailAddress = $(this).html().replace(' [ @ ] ','@');
$(this).html('<a href="mailto:' + emailAddress + '">' + emailAddress + '</a>');
});
};
return {
email: email
};
}();
//using the module when the dom's ready
jQuery(document).ready(function($){
MNS.obfuscate.email();
});
我到底有几个模块。一些自然包含的“私人成员”,在这种情况下意味着变量和/或函数,这些变量和/或函数对于本模块中的其他函数仅仅是重要的,因此并没有在返回语句中结束。
我认为我的代码连接的部分(与搜索示例有关的所有内容)组合在一个模块中是有意义的,给出了整个事物结构。
但是写这之后,我由约翰(Resig的),在那里他还写了关于模块模式的性能读取article:
“实例化功能与一群原型的属性是非常,非常,如果你有一个你想让人们进行交互的经常访问的函数(返回一个对象),那么有利于你拥有对象的属性在原型链中并将其实例化,其代码如下:
// Very fast
function User(){}
User.prototype = { /* Lots of properties ... */ };
// Very slow
function User(){
return { /* Lots of properties */ };
}
(约翰提到他并不反对模块模式“本身” - 只是为了让你知道:)
然后我不知道如果我正在用我的代码进入正确的方向。事情是:我真的不需要任何私人成员,我也不认为我暂时需要继承。 我现在想要的只是一种可读/可维护的模式。我想这可以归结为个人喜好,但我不想结束那些具有(相当严重的)性能问题的可读代码。
我不是JavaScript专家,因此就性能测试而言,更不是专家。首先,我不知道John提到的东西(“经常访问的函数(返回对象),你希望人们与之交互的东西”,很多属性等等)适用于我的代码。我的代码交互的文档不是很大,有100或1000个元素。所以也许这根本不是问题。
但它来到我的脑海里的一件事是,而不是仅仅有
$('span.email').each(function(){
var emailAddress = $(this).html().replace(' [ @ ] ','@');
$(this).html('<a href="mailto:' + emailAddress + '">' + emailAddress + '</a>');
});
(在domready中函数内部),我创建两个“额外”的功能,模糊和电子邮件,由于使用的模块模式。创建附加功能需要一段时间。问题是:在我的情况下它会是可衡量的吗?
我不确定是否在上面的示例中创建了闭包(在jQuery论坛上的一篇有趣的文章中,我阅读了以下内容:“有一个关于内部函数是否创建闭包的哲学争论, t在外部函数的变量对象上引用任何东西......“),但是我确实在我的真实代码中有闭包。尽管我不认为我在那里有任何循环引用,但我不知道这会导致内存消耗高/垃圾收集问题的程度如何。
我真的很想听听你的意见,也许看到你的代码的一些例子。另外,您更喜欢哪些工具来获取有关执行时间,内存和CPU使用率的信息?
谢谢你的回答!我将不得不考虑一下它的主要部分,我想:) 至于电子邮件功能:你当然是对的。我只是想要一个简单的例子,并将其复制到其中。我现在改变了,所以它会更有意义。 – north 2010-03-04 09:19:09