【问题标题】:who can help me optimized this javascript code?谁能帮我优化这个 javascript 代码?
【发布时间】:2013-06-20 03:21:12
【问题描述】:

这是我的部分代码,但是朋友说变量(如getStyle,getOffsetWidth,getOffsetHeight,log)不会释放,所以我想知道为什么变量不会释放,以及如何优化它,谢谢!

   var Util = (function() {
        "use strict";
        var getStyle = function(node) {
            var style = null;
            if (window.getComputedStyle) {
                style = window.getComputedStyle(node, null);
            } else {
                style = node.currentStyle;
            }
            return style;
        };

        var getOffsetWidth = function(style) {
            return parseInt(style.width, 10) +
                parseInt(style.paddingLeft, 10) +
                parseInt(style.paddingRight, 10) +
                parseInt(style.marginLeft, 10) +
                parseInt(style.marginRight, 10);
        };

        var getOffsetHeight = function(style) {
            return parseInt(style.height, 10) +
                parseInt(style.paddingTop, 10) +
                parseInt(style.paddingBottom, 10) +
                parseInt(style.marginTop, 10) +
                parseInt(style.marginBottom, 10);
        };

        var log = function() {
            if (window.console && window.console.log) {
                window.console.log(arguments);
            }
        };

        return {
            getStyle: getStyle,
            getOffsetWidth: getOffsetWidth,
            getOffsetHeight: getOffsetHeight,
            log: log
        };
    }());

【问题讨论】:

  • "variable doesn't release"是什么意思,我不明白...
  • 您可能希望将}()); 更改为})();。除此之外,“不释放”是什么意思?你的朋友指的是什么变量?
  • 看看下面的页面,它解释了 javascript 内存管理并讨论了垃圾收集:developer.mozilla.org/en-US/docs/Web/JavaScript/…
  • @Blender }()); 也是 valid syntax。
  • @canon:是的,这就是我说“可能”的原因。这是更常见的语法,至少在我看过的项目中是这样。

标签: javascript memory-leaks closures


【解决方案1】:

您的朋友可能指的是变量getStyle、getOffsetWidth 等包含在返回方法的闭包中。这有点低效,因为这些变量永远不会再次使用。

在这种简单的情况下,Util 对象中的函数没有使用外部函数的闭包,没有理由不这样做:

var Util = {
  getStyle: function(style) {
    return parseInt(style.width) + ...
  },
  getOffsetWidth: ...
};

【讨论】:

  • parseInt 中的 10 不一定是默认值。来自 MDN:“表示上述字符串的基数的整数。始终指定此参数以消除读者混淆并保证可预测的行为。当未指定基数时,不同的实现会产生不同的结果。”
  • 对不起,这个答案完全没有抓住重点。我把你推荐给......哦,好吧,没关系。
  • @Beetroot-Beetroot:OP 的问题是为什么保留这些变量。我理解使用闭包定义私有方法的价值,但这不是一种应该盲目应用于每种情况的模式。
【解决方案2】:

是的,这是一个以模块模式编写的模块。

自执行匿名函数形成一个闭包——或者如果你有心的话(我不是)形成一组闭包——建立四个通过返回表达式公开的特权方法作为Util 的属性。

此模式还可能包括私有变量/方法,它们与getStyle、getOffsetWidth 等建立在完全相同的范围内,但不会通过返回表达式公开。

这是建立一个或多个单例“命名空间”对象的一种完全有效的方法,这正是模块模式的目标。

【讨论】:

    猜你喜欢
    • 2019-08-28
    • 2020-01-08
    • 1970-01-01
    • 2011-05-03
    • 1970-01-01
    • 2015-08-28
    • 2020-10-29
    • 1970-01-01
    • 2020-08-13
    相关资源
    最近更新 更多