2013-05-08 17 views
1

今天我遇到了一個奇怪的錯誤。javascript eval上下文不包含參數chrome

當我調用鉻下面的函數,我得到:

var t = function(i){console.log(i);console.log(eval("i"));};

t("123");

//the result in chrome

123

undefined

,但在Firefox調用上面的代碼,就出來了,就像我想:第二個日誌聲明是一樣的第一。

在我看來,eval語句將使用匿名函數的上下文作爲其運行時上下文,其中包含參數。

我沒有發現任何涉及eval上下文和參數的內容。

有誰能告訴我爲什麼?


其實,我用tempo.js來呈現html,並出現了類似的問題,因爲我上面列出。

的源代碼是在這裏:

_replaceVariables: function (renderer, _tempo, i, str) { 
     return str.replace(this.varRegex, function (match, variable, args) { 
      try { 
       ... 

       if (variable === '.') { 
        val = eval('i'); 
       } else if (utils.typeOf(i) === 'array') { 
        val = eval('i' + variable); 
       } else { 
        val = eval('i.' + variable); 
       } 
       ..... 
      } catch (err) { 
       console.log(err); 
      } 

      return ''; 
     }); 
    }, 

當鉻運行,eval語句遇到錯誤這樣的:

TypeError: Cannot convert null to object

我想不通爲什麼會這樣,所以我嘗試在開始的代碼。

+0

看起來像chrome eval函數只執行代碼,而不是返回值。在chrome和firefox中嘗試eval(「console.log(i)」) – Eugene 2013-05-08 15:59:37

+0

@Eugene它實際上返回值,這是我的錯誤。謝謝。 – simplemx 2013-05-08 16:39:58

回答

1

console函數的Chrome控制檯實現涉及一些異步行爲,這些異步行爲會導致您發現的奇怪問題。

也就是說,在您的特定情況下,我的Chrome會記錄兩次「123」。我發現它通常是一個很好的主意,以增加調試與一些獨特的識別文本輸出:

var t = function(i){console.log("param is " + i);console.log("eval result is " + eval("i"));}; 

的Chrome瀏覽器控制檯輸出崩潰重複線路,並用一個小圓圈計數器前綴而已:

http://gutfullofbeer.net/so/console_chrome.png

「123」之前的那個小「2」表示它被記錄了兩次。

+0

謝謝你的大力幫助,這是我犯的一個錯誤。我沒有注意到這個小小的「2」:(但是我確實在這樣一個eval語句中得到了一個typeerror。你知道爲什麼嗎? – simplemx 2013-05-08 16:37:45

相關問題