Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/432.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
不同JavaScript闭包的优缺点_Javascript_Closures - Fatal编程技术网

不同JavaScript闭包的优缺点

不同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

我正在温习一些东西,突然我想起了他关于结束的一个例子。他给出了一个简单程序的两个变体示例(除其他外),如下所示:

示例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 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中的数组保留在内存中,直到所有引用都失效。当事情变得复杂时,有时会导致内存泄漏。关于垃圾收集的有趣之处。这不是我研究过的主题,但我想我已经大致了解了。