2017-07-17 65 views
1

我正在使用es2015的應用程序工作。理想情況下,我們只想編寫es2015代碼並在瀏覽器上運行該代碼,因爲我們的目標是支持es2015的瀏覽器。但是,我有一個在Safari 10.1下面的代碼有問題:從功能無法訪問的ES6根常量

const rootX = 1; 
var varX = 2; 

function g(){ 
    console.log('var inside : ', varX); 
    console.log('const inside : ', rootX); 
} 
g(); 

在Safari 10.1,我得到的「參考錯誤,找不到變量:rootX」第二控制檯輸出線。這是正確的ES6行爲?我似乎無法找到任何人在網絡上討論這種情況。我的猜測是該函數在const定義之上被掛起,因此const未定義。 Chrome中使用相同的代碼。

我能找到的唯一解決方法是使g爲胖箭頭功能。我可以這樣做,除非我們使用的一些npm模塊似乎也會碰到這個問題。這是es2015的預期行爲嗎?我能期待圖書館作者將在未來解決這些問題,還是我現在可以做些什麼來緩解這一問題?

您可以在這裏嘗試一下: http://jsbin.com/taruwudufu/edit?html,js,output

UPDATE:Safari瀏覽器技術預覽不會拋出這個錯誤,所以看起來它確實是一個Safari瀏覽器漏洞,將被固定前進。

+0

不,這不正確的ES6行爲。把'g'改成箭頭函數可以解決任何問題也沒有什麼意義。 – Ryan

+0

'我可以期待圖書館作者將來會解決這些問題嗎? - 如果該代碼的行爲如你所說,那麼問題出在Safari的JavaScript引擎 - Safari,新的互聯網爆炸者 –

+1

是的,我也遇到過這個問題。絕對是圍繞塊範圍界定的Safari錯誤。 – loganfsmyth

回答

1

這是實際的JSBin賽跑運動員代碼:

try { 
    const rootX = 1; 
    var varX = 2; 

    function g() { 
     window.runnerWindow.proxyConsole.log('var inside : ', varX); 
     window.runnerWindow.proxyConsole.log('const inside : ', rootX); 
    } 
    g(); 
} catch (error) { 
    throw error; 
} 

我可以看到可以在這裏發生的事情是:

  1. rootX可以被限制在try塊
  2. varXg()被吊起來,範圍在全球範圍內

g()執行時varX可通過全局範圍使用。然而,在全球範圍內並未聲明rootX,並且引發了ReferenceError

注意:只需在Safari的js控制檯中運行代碼片段就可以正常工作。並且,用周圍的try-catch語句運行代碼段將爲rootX拋出ReferenceError

注2:如果未使用全局作用域,代碼將在Safari中運行。

(function() { 
 
    const rootX = 1; 
 
    var varX = 2; 
 

 
    function g() { 
 
     console.log('var inside : ', varX); 
 
     console.log('const inside : ', rootX); 
 
    } 
 
    g(); 
 
})();

一個變通可能是包裹在IIFE建立輸出文件。

+0

我認爲控制檯的結果可能是一條紅色的鯡魚,因爲如果不在塊內輸入,每行都會被評估。我最初在ES6模塊內遇到過這個問題。 – pkenway

+0

可能。如果有幫助,我會添加另一個註釋。 –