2013-04-04 39 views
2

以下需要在功能範圍內,因爲不會出現奇怪的行爲是交互式控制檯模式。JavaScript語法瘋狂:指向eval函數的指針是不是eval函數?

下面的函數返回5預期

(function() { var x = 5; return eval("x"); })() 

一個簡單透明的(ISH)的變化:

(function() { var x = 5; var j = eval; return j("x"); })() 

產生錯誤:

ReferenceError: x is not defined 

這是某種奇怪的安全測量?

+1

只是一個網站照會eval間接調用在全球範圍內,其中x是不可見的評估var j = eval;':http://ejohn.org/blog/ecmascript-5-strict-mode-json-and-more/ – jantimon 2013-04-04 12:21:34

回答

6

您的第二個示例是間接致電eval

var x = 10; 

// This will return 10 
(function() { 
    var x = 5; 
    var j = eval; 
    return j("x"); 
})(); 

// This will return 5 
(function() { 
    var x = 5; 
    return eval("x"); 
})(); 

the spec: - `「使用嚴格的」`不允許設置`

 1. ...if the eval code is not being evaluated by a direct call to the eval function then

     a. Initialize the execution context as if it was a global execution context...

+0

這是特定於eval嗎?我用一個簡單的函數進行了檢查,似乎複製的引用保留了上下文。 – 2013-04-04 12:20:25

+1

@PeterAronZentai - 是的,這是特定於'eval'。閱讀我已鏈接的規範部分。 – 2013-04-04 12:23:04

+0

上一個問題:爲什麼window.eval被視爲一個間接調用,因爲global.something應該等同於某個東西,aint? – 2013-04-04 12:26:49