2016-04-15 19 views
9

看到這個代碼:就拿讓變量out時間死區的

<script> 
 
let {foo} = null; // TypeError 
 
</script> 
 
<script> 
 
// Here I want to assign some some value to foo 
 
</script>

第一個腳本試圖通過解構賦值讓-申報foo。但是,null不能被解構,因此賦值會引發TypeError。

的問題是,那麼foo變量聲明但未初始化的,所以如果在第二個劇本我試圖引用foo,它拋出:

foo = 123; // ReferenceError: can't access lexical declaration `foo' before initialization 

而且let變量不能重新聲明:

let foo = 123; // SyntaxError: redeclaration of let foo 

是否有任何方法將它從TDZ中取出,以便我可以分配值並讀取它們?

+0

順便說一句,我想使用'foo',而不是像'window.foo'這樣的解決方法。 – Oriol

+0

我猜想有一件有趣的事情讓第一個腳本確保初始化的有效性變得困難。 – Pointy

+0

@Oriol:'window.foo' [反正無法工作]:(http://stackoverflow.com/q/28776079/1048572):-) – Bergi

回答

2

這是不可能的。暫時死亡區域和限制訪問未初始化的變量預計是不可避免的。這是令人困惑和有問題的,但意圖和預期。

詳見spec

注意讓和const聲明定義被限定在運行中的執行上下文的LexicalEnvironment變量。 變量在包含詞法環境實例化時創建,但在以變量的LexicalBinding進行評估之前可能無法以任何方式訪問。由LexicalBinding和初始化程序定義的變量在評估LexicalBinding時被分配其初始化程序的AssignmentExpression的值,而不是在創建變量時分配。如果在let聲明中LexicalBinding沒有一個初始化的變量賦值爲未定義時LexicalBinding進行評估。\

所以,如果變量沒有在聲明中初始化(和初始化之前拋明顯導致無初始化)它不能被任何方式訪問。

但事實上,你的問題比投擲分配更復雜。這是架構問題 - 您依賴於可變全局變量。這很大「不,不」,你應該重構你的代碼來使用顯式依賴。