我正在刷一些good JavaScript practise, courtesy of Douglas Crockford,当有什么事情让我想起他关于封闭的一个例子。他给出了一个简单程序的两个示例变体(在许多其他程序中),如下所示:
示例1:
var digit_names = function(n) {
var names = ['zero', 'one', 'two', 'three',
'four', 'five', 'six', 'seven', 'eight', 'nine'];
return names[n];
};
digit_names(3); // three
示例2:
var digit_names = ( function(n) {
var names = ['zero', 'one', 'two', 'three',
'four', 'five', 'six', 'seven', 'eight', 'nine'];
return function() {
return names[n];
};
}());
digit_names(3); // three
他对第一个例子的主要评论是每次函数运行时都必须在内存中创建一个数组。而在第二个例子中 - 尽管没有明确提到 - 我会相信数组将成为digit_names
函数对象的属性,它只存储在内存中一次。
尽管是一个简单的例子,我可以清楚地看到第二个模式的好处,因为数组不需要重复分配给内存。
我不太清楚的是,这是唯一的收益,还是第二个例子可以提供的任何其他优势?
此外,是否存在任何(可能是边缘的)使用第一范式可能更有意义的情况?由于使用IIFE包装,是否存在任何潜在的限制?