2015-11-12 69 views
2

我已經知道,在event handler content attribute中,範圍被元素遮蔽。爲什麼事件處理程序能夠劫持我直接調用eval?

因此,在下面的代碼片段中,(1,eval)解析爲按鈕的自定義eval屬性,所以背景變爲綠色而不是紅色。

document.querySelector('button').eval = function(){ return 'green'; };
<button onclick="document.body.style.background = (1,eval)('red')">Click me</button>

此行爲的getting the current value of the event handlerstep 10定義,是有道理的。

但在下面的代碼片段中,我使用了一個名爲eval的引用,所以它應該直接調用本地eval。然而,被叫功能按鈕的定製eval,就好像它是一個間接調用:

document.querySelector('button').eval = function(){ return 'green'; };
<button onclick="document.body.style.background = eval('red')">Click me</button>

+0

有EVAL之間'(),真的沒有太大的區別''(1,EVAL)()' – Pointy

+0

@Pointy'(1,EVAL)()'始終是一個間接調用和'eval()'通常是直接調用。 – Oriol

+0

好的,你說的是奇怪的「它真的是'eval'」規則。得到它了。不過,在這種情況下,符號'eval'將是本地的,這當然是你的答案。 – Pointy

回答

2

的問題是,爲了使直接調用eval,使用一個名爲eval的參考是不夠的。該參考還需要解析爲內置的eval

在ES5這在15.1.2.1.1 - Direct Call to Eval說明:

直接調用eval函數是一個被表示爲 CallExpression滿足以下兩個條件:

  • ReferenceMemberExpressionCallExpression有一個環境記錄作爲其基準值,其參考名稱爲"eval"

  • 調用抽象操作GetValueReference作爲參數的結果是標準內置函數 在15.1.2.1定義。

而在ES6它12.3.4.1 - Runtime Semantics: Evaluation

  1. 自行指定讓裁判是評估MemberExpression的結果。
  2. funcGetValueref)。
  3. ReturnIfAbruptfunc)。
  4. 如果TypeREF)是ReferenceIsPropertyReferenceREF)是GetReferencedNameREF)是"eval",然後

    1. 如果SameValueFUNC,% eval%)是true,然後

事實上,事件處理程序是不相關的。如果您覆蓋全球eval,您將會遇到同樣的問題。

window.eval = function(){ return "green"; }; 
 
alert(eval('red')); // "green"

相關問題