不同JavaScript闭包的优缺点
我正在温习一些东西,突然我想起了他关于结束的一个例子。他给出了一个简单程序的两个变体示例(除其他外),如下所示: 示例1:不同JavaScript闭包的优缺点,javascript,closures,Javascript,Closures,我正在温习一些东西,突然我想起了他关于结束的一个例子。他给出了一个简单程序的两个变体示例(除其他外),如下所示: 示例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
var digit_names = function(n) {
var names = ['zero', 'one', 'two', 'three',
'four', 'five', 'six', 'seven', 'eight', 'nine'];
return names[n];
};
digit_names(3); // three
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
示例2:
var digit_names = function(n) {
var names = ['zero', 'one', 'two', 'three',
'four', 'five', 'six', 'seven', 'eight', 'nine'];
return names[n];
};
digit_names(3); // three
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\u names
函数对象的一个属性,它只存储在内存中一次
尽管只是一个简单的例子,但我可以清楚地看到第二种模式的好处,因为数组不需要重复分配给内存
我不太清楚的是,这是唯一的好处,还是第二个例子可以提供任何其他好处
此外,是否有任何(可能是边缘)情况下使用第一种范式可能更有意义?由于使用IIFE包装器,是否存在任何潜在的限制?我认为这个示例的主要目的是解释闭包,而不是推荐它作为一种有用的模式。就个人而言,我会选择可读的代码,并且只在需要时才进行优化。您可以通过阅读来探索不同的模式和优势。还请注意,示例1中的数组可用于垃圾收集,而示例2中的数组保留在内存中,直到所有引用都失效。当事情变得复杂时,有时会导致内存泄漏。关于垃圾收集的有趣之处。这不是我研究过的主题,但我想我已经大致了解了。