2017-10-11 173 views
0

我不知道爲什麼我在控制檯中獲得undefined。我閱讀了關於範圍變量的知識,並且知道在範圍外定義一個變量應該使該變量可以在特定函數範圍之外訪問。 不知道我在做什麼錯在這裏:未定義的值,變量範圍問題

const history = createHistory(); 
const location = history.location; 
let loc; 
const listen = history.listen((location) => { 
    loc = `${location.search}${location.hash}`; 
    return loc; 
}) 
console.log(loc); 

我的控制檯登錄undefined

+1

請注意,'location'是'window'上的一個全局變量,您可以通過'window.location'或甚至'location'訪問它。 – JohnnyCoder

回答

1

也就是說怎麼一回事,因爲你正在登錄loc已分配一個值之前。它僅被初始化,因此其值爲undefined。當回調傳遞給listen時,它將被賦值。要登錄,你需要你的代碼更改爲正確的值:

const history = createHistory(); 
const location = history.location; 
let loc; 
const listen = history.listen((location) => { 
    loc = `${location.search}${location.hash}`; 
    console.log(loc); 
}) 

我認爲listen是asynchronus,所以在這種情況下,你真的不能返回,或使用你在你的問題中所述的方式。但是,一旦您處於listen回調中,您可以將該值傳遞給其他回調。有關更多解釋和示例,請參閱How do I return the response from an asynchronous call?

+0

感謝您的回覆!這裏的問題是我想在'listen'函數之外使用'loc'。截至目前,我只有一個console.log用於簡化。但是我想要做的就是一旦我給'listen'裏面的'log'賦值,我想在該列表的外部使用'loc'。那可能嗎? – vanegeek

0

console.log(loc);該變量未定義的時刻。

由於此功能

(location) => { loc = `${location.search}${location.hash}`; } 

後,它將運行。

0

問題是,history.listen方法僅在位置更改時調用。 history.listen(...)調用聲明瞭當歷史記錄發生變化時應該調用的代碼,但該代碼在那時尚未運行。

僞代碼,這裏是你已指示什麼:

  • 聲明一些常量和變量
  • 註冊一些代碼運行時的歷史變遷
  • 打印出來的值(仍

    :未初始化)變量控制檯

你的意思,這可能是更接近於0

const history = createHistory(); 
const location = history.location; 
let loc; 

const listen = history.listen((location) => { 
    loc = `${location.search}${location.hash}`; 
    console.log(loc); 
}) 
0

您可以,但如其餘的說,loc變量將不會被分配一個值,直到您更改位置,因此執行監聽方法。在此之前,其值將爲undefined。另外,爲什麼你想要有listen變量,當你已經在你的代碼之上聲明時返回值爲loc