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++;} 
};