背景
我经常使用模块模式来组织我的代码,以便函数和常量在需要知道的基础上运行。如果CONSTANT
orsomeFunc
仅由 使用anotherFunc
,那么我将 的定义包含anotherFunc
在一个匿名函数中,这样前两者就不会污染全局范围。这有助于避免名称冲突,还可以让您保证稍后查看代码取决于什么。
不过,这种策略确实会创建许多闭包,我想知道显式传递这些依赖项是否会更好地提高性能(并且也更易于维护)。我认为这具有最小化函数必须遍历以查找变量的作用域链的效果。
只是为了允许对模块模式本身的反馈,我包含了三个版本:1)没有模块模式,2)有它,3)有它和范围链最小化。
没有模块模式
var SHARED_CONSTANT;
var SOME_CONSTANT = 5;
var INNER_CONSTANT = {};
var inner = function(y) {
return y !== {};
};
var outer = function g (x) {
doSomething();
$(...).load(inner);
};
使用模块模式,但没有范围链最小化
var SHARED_CONSTANT;
var outer = (function() {
var SOME_CONSTANT = 5;
var inner = (function() {
var INNER_CONSTANT = {};
return function /* inner */ (y) {
return y !== {};
};
}());
return function /* outer */ (x) {
doSomething();
$(...).load(inner);
};
}());
使用模块模式和范围链最小化
var SHARED_CONSTANT;
var outer = (function($, SHARED_CONSTANT) {
var SOME_CONSTANT = 5;
var inner = (function(SOME_CONSTANT, SHARED_CONSTANT) {
var INNER_CONSTANT = {};
return function /* inner */ (y) {
return y !== {};
};
}(SOME_CONSTANT, SHARED_CONSTANT));
return function /* outer */ (x) {
doSomething();
$(...).load(inner);
};
}(jQuery, SHARED_CONSTANT));
概括
哪个版本应该有更好的性能(为什么)?性能差异是否显着?(即作用域链查找是否昂贵?)内存使用情况如何?(即通过传入变量,我本质上是在复制范围,对吗?)