0

我正在编写一个小的 JavaScript 框架,以实现类似于骨干网的有趣和可能的实现(因此有标签)。我已经开始将元素保存为对象属性,如下所示。我不确定我是否见过这样做,所以我很好奇这是否会导致任何问题。

同样,如果模块依赖于其他模块,我会在对象顶部以....另一个对象的形式列出这些模块。

我想要一种列出依赖项(页面元素或 JavaScript 模块)并预先检测任何问题的方法。这与依赖注入具有相似(不同)的好处。

这是此代码审查帖子中的一个特定问题,它进一步解释了框架的工作原理。

/*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);
    }
});
4

1 回答 1

2

好的,首先让我提供强制性的“通过重新发明轮子,你永远不会得到更好的轮子”警告。无论你想要完成什么,如果你使用现有的库,几乎可以肯定你会更成功。即使你有充分的理由自己制作,至少看看现有的库仍然会让你受益匪浅。

但是……也许你只是在玩这个项目,而看其他项目并不好玩,所以你没有做。很公平。

无论如何,如果您确实查看 Backbone,您会发现这种做法是 Backbone View 类的核心。Backbone 中的每个视图都有一个“el”和“$el”属性,它们引用视图的原始 DOM 元素和该元素的 jQuery 包装版本。

Backbone 对此没有真正的性能问题,因为 JS 中的变量/属性只是指针;换句话说,当你将一个对象的属性设置为一个元素时,你并没有复制那个元素,你只是添加了一个对它的引用(换句话说,它更像是一个 A 标签而不是而不是一个全新的文件)。

有一次 Backbone 确实有问题(你的框架也会有问题)是使用过时的引用。换句话说,如果你只是从页面中删除元素 X,浏览器将停止为它使用内存(最终,通过垃圾收集)。但是如果有一个对象指向那个元素,它就不会被垃圾收集,因为任何有引用的东西都不是“垃圾”。

因此,您必须注意的主要事情是确保这些对象:

A)只要他们的元素被删除,或者

delete obj.referenceB)当他们的元素被删除时摆脱他们的引用(例如)

如果你不这样做,事情可能仍然会正常工作......直到你在一个页面上使用它并且创建/删除了很多元素,此时 Firefox 将开始弹出“这个脚本花费了太长时间快跑,你真的确定要这么做吗?” 消息。

于 2012-12-12T20:31:46.427 回答