0

这是我的部分代码,但朋友说变量(如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
        };
    }());
4

2 回答 2

1

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

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

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

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

于 2013-06-20T03:38:15.590 回答
1

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

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

var Util = {
  getStyle: function(style) {
    return parseInt(style.width) + ...
  },
  getOffsetWidth: ...
};
于 2013-06-20T03:32:29.497 回答