2017-01-24 129 views
0

所以我從twitch API中檢索了一堆JSON並試圖在div上附加一些東西。無法在我的回調函數中訪問全局變量?

HTML:

<div id="streamers" class="streamers"> 

</div> 

JS:

const channels = ["ESL_SC2", "OgamingSC2", "cretetion", "freecodecamp", "storbeck", "habathcx", "RobotCaleb", "noobs2ninjas"]; 
const streamers = document.getElementById("streamers"); 
for(let i = 0; i < channels.length; i++) { 
    let url = "https://api.twitch.tv/kraken/streams/" + channels[i] + "?client_id=blahblahblahblah&callback=?"; 

    function callback(data) { 
    const li = document.createElement("li"); 
    li.textContent = channels[i]; 
    console.log(li); 
    streamers.appendChild(li); 
    } 

    $.getJSON(url, callback); 
} 

但是我收到一個Cannot read property 'appendChild' of null錯誤。我試過console.log(streamers)但是這返回null。訪問channels是沒有問題的,這也是一個全局變量。

我可以通過將streamers const放入回調函數來輕鬆解決問題。但是我想知道的是爲什麼我無法在全球範圍內訪問它?如果我是正確的,那麼在函數中未定義的變量將在外面搜索,直到找到匹配。

謝謝, 詹姆斯。

+0

似乎是懸而未決的問題。嘗試一次使用匿名方法'.getJSON(URL,函數(數據){li} {document.createElement(「li」); li.textContent = channels [i]; console.log(li); streamers .appendChild(li); });' – Satpal

+1

作爲一個測試,如果你試圖在定義拖放的下面的行上添加子節點,(即在函數之外)是否起作用? –

+0

您確定在id爲'streamers'的**元素已添加到DOM之後,是否正在執行'document.getElementById('streamers')'**? – Ankit

回答

0

基於以下定義 「let和const聲明定義了作用域爲正在運行的執行上下文的LexicalEnvironment的變量。」

for(let i = 0; i < channels.length; i++) { // it enter's to a new scope