0

我正在阅读有关IIFE的article,但认为它带来的主要价值在于它为变量创建隐私,因为在下面的代码中,如果放置在IIFE中,“i”不能更改。但是,命名空间呢?如果两者都包含“counter”范围内的变量,那么两者之间有什么区别?IIFE如何保护命名空间?

var counter = { 
    i: 0, 
    increment: function() {i++;} 
}; 

var counter = (function() { 
    var i = 0; 
    return { 
    increment: function() {i++;} 
    }; 
})(); 

回答

1

没有办法从声明它的函数之外访问局部变量,除非函数选择返回引用。由于Javascript只具有函数范围,并且没有版本提供namespace块,所以这是从其他代码隐藏变量的唯一方法。

与ES6推出的其他范围,您可以使用块范围或理想,模块范围,以简化这个:

let i = 0; 
export default { 
    increment: function() {i++;} 
};