2016-09-23 44 views
0

變量的訪問,我有以下關閉:從IIFE

var Container = (function() { 
    var variable; 
    var changeVariable = function() { 
     variable = 5; 
    }; 
    return { 
     variable: variable, 
     changeVariable: changeVariable 
    }; 
})(); 

Container.changeVariable(); 
console.log(Container.variable); 

的結果是不確定的,除非我設置變量:

Container.variable = 5

爲什麼會這樣呢?有什麼不同?我應該如何正確地做到這一點?

+0

您已經通過** value **返回變量,而不是通過引用。該變量在IIFE內更新,但返回的值不是。 – Tushar

回答

2

爲什麼會這樣呢?

JavaScript按值分配。

variable = 5;將值5賦值給變量variable

variable: variable,(當時代碼運行)到屬性variable分配的variable值。它不會創建對名爲variable的變量的引用。

當您稍後更改名爲variable的變量的值時,不會更改名爲variable的屬性的值。

我該如何正確地做到這一點?

創建一個對象。將對象存儲在本地。操縱那個對象。返回該對象。

忘記變量名爲variable完全。

var container = (function() { 
 

 
    var self = { 
 
    variable: undefined, 
 
    changeVariable: changeVariable 
 
    }; 
 

 
    function changeVariable() { 
 
    self.variable = 5; 
 
    } 
 

 
    return self; 
 
})(); 
 

 
container.changeVariable(); 
 
console.log(container.variable);

(旁白:會議有權以大寫字母構造函數開始的名稱我已經改名爲Container遵循這一慣例。)。

2

使用一個getter:

return { 
    get variable() { return variable; }, 
    changeVariable: changeVariable 
}; 
+1

沒有說明? – Tushar

+1

不要僅僅轉儲代碼,不要解釋它的工作原理和原因。 – vlaz