2012-10-01 32 views
1

在嚴格模式下,間接調用eval應將this綁定到eval代碼中的全局對象。爲什麼(0 || eval)在Opera中不被視爲間接?

10.4.2:在版本5中,對eval函數的間接調用使用全局環境作爲eval代碼的變量環境和詞法環境。在版本3中,間接評估的調用者的變量和詞彙環境被用作評估代碼的環境。

然而,在Opera,在undefined這個表達式的結果:

(function(){'use strict'; return (0 || eval)('this'); }()) 

Chrome和Firefox按預期方式工作。

我發現這個在這裏:http://kangax.github.com/jstests/indirect-eval-testsuite/

這是一個瀏覽器錯誤?如果是這樣,它是否被追蹤?

參見Why do some forms of indirect eval fail in Opera and Safari?

+0

嘗試評估其他內容,例如警報。如果它能解決歌劇問題。 – Zaffy

+0

@Zaffy我不知道你的意思是什麼......無論「this」是否指向全局對象,「alert」都可以工作。 –

+0

哦,對不起,我認爲eval不能在嚴格模式下使用。我的愚蠢對不起。 – Zaffy

回答

3

Opera的ECMAScript的引擎似乎是在這裏做一些過於急切的優化,其中「(0 || EVAL)」就被簡化爲「EVAL」編譯之前。在這種情況下,這種優化引入了一個錯誤,因爲它改變了代碼的行爲。

(在Opera內部,我們將此問題作爲CORE-47727進行跟蹤)

+0

謝謝,我認爲這可能是問題,但很高興聽到確認。你有什麼想法這裏發生了什麼:http://stackoverflow.com/questions/12666272/?這對我來說真是令人費解,因爲你在Safari中獲得了相同的行爲,而且看起來有意爲之,但似乎並未遵守ES5。 –

+0

已回覆:) – hallvors

相關問題