我正在编写一个小型JavaScript框架,以实现与骨干类似的有趣和可能的实现(因此标记)。我已经开始将元素保存为对象属性,如下所示。我不确定我是否已经看到这件事,所以我很好奇这是否会导致任何问题。
同样,如果模块依赖于其他模块,我会以....另一个对象的形式列出对象顶部的那些模块。
我想要一种方法来列出依赖项(页面元素或JavaScript模块)并预先检测任何问题。这与依赖注入具有相似(不相同)的好处。
这是关于这篇code review帖子的一个具体问题,它进一步解释了该框架的工作原理。
/*MUserTry
**
**
**
*/
$A.modelAjax({
Name: 'MUserTry',
S: {
DynSma: SDynSma,
DynTwe: SDynTwe,
DynArc: SDynArc,
AniFlipPage: SAniFlipPage,
ClientStorage: SClientStorage
},
E: {
but: $A('#ut_but')[0]
},
J: {
box: $('#ut_box')
},
init: function () {
var pipe = {},
this_hold = this;
this.J.box.draggable();
this.E.but.addEventListener("click", function () {
pipe = $A.definePipe(this_hold.Name);
$A.ajaxMachine(pipe);
}, false);
},
pre: function (pipe) {
pipe.page.email = this.e_button.getAttribute('data-email');
pipe.proceed = true;
},
post: function (pipe) {
this.S.ClientStorage.setAll(pipe.server.smalls);
this.S.DynSma.run(pipe.server.smalls);
this.S.DynArc.run(pipe.server.arcmarks);
this.S.DynTwe.run(pipe.server.tweets);
this.S.AniFlipPage.run('ma');
},
finish: function (pipe) {
$A.log(pipe);
}
});
答案 0 :(得分:2)
好吧首先让我提供强制性的“你永远不会通过重新发明轮子来获得更好的轮子”警告。无论你想要完成什么,如果使用现有的库,你几乎肯定会更成功。即使有充分的理由让你自己创造,至少看看现有的图书馆仍然会让你受益匪浅。
但是......也许你只是在玩这个项目,看看其他项目并不好玩,所以你不是这样做的。很公平。
在任何情况下,如果你看看Backbone,你会发现这种做法是Backbone View类的核心。 Backbone中的每个视图都有一个“el”和“$ el”属性,它引用视图的原始DOM元素和该元素的jQuery包装版本。
Backbone没有真正的性能问题,因为JS中的变量/属性只是指针;换句话说,当你将一个对象的属性设置为一个元素时,你不是要复制那个元素,你只是添加一个对它的引用(换句话说,它更像是你的A标签而不是而不是一整篇新文件。)
一次Backbone确实有问题(而且你的框架也会)有陈旧的引用。换句话说,如果您只是从页面中删除元素X,浏览器将停止使用内存(最终通过垃圾回收)。但是如果有一个指向该元素的对象,它将不会被垃圾收集,因为带引用的任何东西都不是“垃圾”。
因此,您必须注意的主要事项是确保这些对象:
A)在元素执行时删除,或
B)当他们的元素被删除时,摆脱他们的引用(例如delete obj.reference
)
如果你不这样做,事情仍然可能会正常工作......直到你在一个有很多元素被创建/删除的页面上使用它,此时Firefox将开始弹出“这个脚本占用了你跑得太久了,你真的确定要这么做吗?“消息。