2015-05-31 22 views
5

我的問題在這裏謊言我正在學習JavaScript,但並不是新的編程。 我理解提升,但嚴格模式不應該產生一個錯誤,並被捕獲當6被分配給未聲明的變量或document.getElement ...被賦值x這不會產生錯誤,所以我的診斷是提升仍在繼續......我不喜歡,並希望擺脫嚴格使用。使用Chrome版本42.0.2311.152米作爲我的瀏覽器'使用嚴格'不停止在功能範圍內提升

function strictMode(){ 
    'use strict'; 
    try { 
     x = 6; 
     document.getElementById('hoisting').innerHTML = x; 
     var x; 
    } 
    catch(err) { 
        document.getElementById('error_report').innerHTML = 
         "There was an error that occured (Were in Strict Mode)" + 
          " " + err.message; 
       } 
} 
+1

我不認爲嚴格模​​式打算刪除吊裝 – GillesC

+0

我讀過它,這就是爲什麼它產生了我的問題......我從各種網站讀取 –

回答

9

變量聲明(即var x;)是有效的都寫在整個範圍內,即使你申報你分配後。這就是"hoisting"的含義:var x;被掛起到範圍的開始,並且分配x = 6;沒有問題,因爲x已在該範圍內的某個位置被聲明。

Strict mode不改變任何這一點。它拋出一個錯誤,如果你完全省略var x;聲明;沒有嚴格的模式,變量的範圍將隱含地成爲全局範圍。

在ES2015(又稱ES6)中,通過使用let關鍵字而不是var來避免吊裝。 (另一個區別是用let聲明的變量對於周圍塊而言是本地的,而不是整個函數)。

+0

關於隱式全局範圍的好消息,傳統上任何聲明在函數範圍僅在函數本身的持續時間內可用且「活躍」。你是說嚴格模式是將範圍界定爲傳統方式的唯一途徑嗎? –

+0

只要你認真寫出'var'聲明,嚴格模式就沒有任何區別。即使沒有嚴格的模式,變量仍然限定在聲明的塊中。如果您_forget_聲明一個變量,那麼嚴格模式僅僅是爲了抓住您。 – Thomas

+0

另請注意,「生活」與「處於範圍」是完全不同的概念。例如,如果我寫'function foo(){var x = {}; return x; }'然後'x'只會在'foo'範圍內,但它的值可能會「活」很長時間,這取決於調用者用它做什麼。 – Thomas

0

有一些奇怪的東西javascript允許,因爲有人學習語言,你必須學會​​用良好的編碼實踐(simicolons是另一個很好的例子)。在提升的情況下,將變量聲明在範圍的頂部通常是一個很好的習慣。如前所述,嚴格模式並非銀彈,也不會爲您執行此操作。

+0

謝謝,我真的更多的是一個正式的程序員,更喜歡舊的方法。我讀了嚴格的話會關閉提升,因此我的測試..它只是困擾我,像其他人說的那樣,提升沒有關閉。 –

+0

我認爲混淆可能來自這樣一個事實,正如@Thomas指出的那樣,嚴格模式確實需要你聲明變量 – aw04