2017-02-21 45 views
1

我想知道爲什麼我得到一個函數中的「x變量未定義」的錯誤,該函數使用一個變量,該變量是在執行功能。下面是摘錄(ES6)函數,使用一個變量定義與讓功能執行

let timeout = resetTimeout(); 

function resetTimeout() { timeout = 0; return timeout } 

爲什麼作用域作用嗎?變量在函數定義之前被定義,所以,爲什麼?

編輯 爲了澄清這個問題,我知道它可以與var。我已經閱讀了關於let和const的範圍,並且我無法理解爲什麼這不會像我期望的那樣工作。我正在尋找的是解釋,而不是解決方案。

+0

var'工作嗎? – AshBringer

+0

當然var工作,關鍵是爲什麼它失敗,讓 – Danielo515

回答

2

您正在使用let創建一個變量,並立即爲其分配函數的返回值。這沒關係。

問題出在功能裏面。沒有指定變量timeout(= 0)的類型,你正在處理使用let之前定義的同一個超時。所以有一個循環引用。讓我們來看看你的代碼是如何執行的:

1 - 第一行調用該函數,timeout在該作用域中創建,但它的值尚未定義。

2 - 在函數體中,'timeout'被設置爲0.由於它在範圍內,所以js不能創建一個全局變量(通常會這樣做)並且賦值會拋出一個錯誤。

修復?如果您希望功能塊內的超時位於本地,只需重命名即可。

使用let就好了。

+0

謝謝你的回答。但是,我仍然不明白爲什麼函數沒有看到外部範圍中聲明的變量。也許這與這個事實有關,即在表達式完成之前該變量不被認爲是被聲明的。由於該函數具有與變量聲明的依賴關係,因此會創建某種依賴性循環,並且該表達式無法完成。然而,這是純粹的猜測,我沒有任何資料證實這一點,所以我在這裏問了一些關於stackoverflow的信息。你知道我說的話是否有意義嗎? – Danielo515

+0

它對我來說也有點奇怪。如果在函數塊頂部聲明變量,那麼使用var或let不應該有任何區別。也許我們可以在這裏看到更詳細的解釋。到目前爲止,看起來你創建了一個有趣的悖論,揭示這種怪異,如果這種行爲不是實施者所期望的。 –

+0

再次感謝你Bulent。你知道我能報告這種奇怪行爲的地方嗎? – Danielo515

-1

考慮到你的更新和這個傢伙的回答,我想說明你不需要重命名你的變量。由於let只能在一個圖層上工作,並且不會深入到範圍中,因此可以在該函數內聲明新的變量超時值。

let timeout = resetTimeout();

function resetTimeout(){let timeout = 0;返回超時; }

希望有所幫助。對不起,以前的答案。

+1

我知道它將與var。我已經閱讀了關於範圍界定的內容,而且我無法理解爲什麼這不能按我的預期工作。我正在尋找的是解釋,而不是解決方案。 – Danielo515

+0

這不是真正的問題。 –

+0

@ Danielo515對不起,我當時不理解你。如果你想在函數內的本地函數內部超時,就像Bulent說的那樣,你不需要重命名它,而不是timeout = 0;在函數中,寫入let timeout = 0;希望能對你有所幫助。 –

相關問題