2016-11-26 79 views
1

我想使用閉包同時存儲和檢索變量。使用閉包存儲和檢索數據

我使用JSONP和回調函數

http://freegeoip.net/json/?callback=geoIPInfo

封閉

function geoIPInfo(newGeoData) { 
    var geoInfo; 
    if (newGeoData) { 
     geoInfo = newGeoData; 
    } 
    var provideGeoData = function() { 
     return geoInfo; 
    }; 

    return provideGeoData(); 
} 

我想先存儲數據,比獲取最後使用簡單的通話一樣,保存從封閉數據

geoIPInfo() 

如果提供參數,它將設置新的信息,否則它將返回現有的信息。

但在我的情況下,數據設置成功,但是當我試圖讓一組數據,我得到undefined

$("#super_button").click(function (e) { 
      alert(geoIPInfo()); 
      e.preventDefault(); 
     }); 

什麼是錯我的理解封? 請解釋。

謝謝。

+0

什麼是錯誤的是,每次你調用geoIPInfo你創建一個新的閉包,你需要的函數返回函數對象,而不是函數調用,並使用該函數對象作爲常規函數 – nottu

回答

2

這將工作。這裏的想法是我們創建一個函數,它返回一個接受參數的函數,並且我們將geoInfo存儲在閉包中以保持它的值。 IDK如果是有道理的,如果你需要一個更好的解釋,我可以給它一個嘗試:)

var geoIPInfo = function() { 
    var geoInfo; 
    var provideGeoData = function (newGeoData) { 
     if (newGeoData) { 
      geoInfo = newGeoData; 
     } 
     return geoInfo; 
    }; 
    return provideGeoData; 
}(); 
+0

它的工作原理,謝謝,可以你可以詳細解釋一下錯誤是什麼,謝謝。 – gzbuaapzroyn

+0

這裏有一本書章的鏈接,它可以比我更好地解釋它。 https://github.com/getify/You-Dont-Know-JS/blob/master/scope%20%26%20closures/ch5.md#nitty-gritty – nottu

1

每次調用geoIPInfo()時,你重新聲明局部變量geoInfo。你會希望通過封閉申報geoInfo一次,有它geoIPInfo()訪問:

//Create a closure 
 
var geoIPInfo = (function(){ 
 

 
    //Private variable, available via closure 
 
    var geoInfo; 
 

 
    function geoIPInfo(newGeoData) { 
 
    
 
    if (newGeoData) { 
 
     geoInfo = newGeoData; 
 
    } 
 
    
 
    var provideGeoData = function() { 
 
     return geoInfo; 
 
    }; 
 

 
    return provideGeoData(); 
 
    } 
 

 
    return geoIPInfo; 
 
})(); 
 

 
alert(geoIPInfo()); //undefined 
 
geoIPInfo('Some Data'); 
 
alert(geoIPInfo()); //'Some Data'

在這裏,我們正在創建使用Immediately-Invoked Function Expression (IIFE)封閉。