背景
我经常使用模块模式来组织我的代码,因此函数和常量在需要知道的基础上运行。如果CONSTANT
或someFunc
仅由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));
摘要
哪个版本应该有更好的性能(以及为什么)?性能上的差异是否显着? (即范围链查找是否昂贵?)内存使用情况如何? (即通过传入变量,我基本上复制了范围,对吗?)
答案 0 :(得分:1)
这些performance tests seem to confirm what I suggested。这是不成熟的优化。
测试没有显示任何明确的喜好。对于任何给定的浏览器,您的三个片段彼此接近,最快的一个变化是我运行它的最多次。在某些运行中,过度优化的代码甚至更慢。
可能是因为JIT优化。
需要学习的课程:尽可能保持代码的可读性,并担心在您知道自己存在瓶颈的情况下进行优化。