2012-01-03 63 views
1

我有最簡單的Chrome擴展包含內容的JavaScript(沒有別的):用的console.log奇怪的輸出(5)

script="\ 
c=0;\ 
(function f() {\ 
    if (++c>20) return;\ 
    console.log(5);\ 
    setTimeout(f, 500);\ 
})();\ 
"; 
scriptBlock = document.createElement('script'); 
scriptBlock.type = 'text/javascript'; 
scriptBlock.appendChild(document.createTextNode(script)); 
document.getElementsByTagName('head')[0].appendChild(scriptBlock); 

這只是注入一小塊JS的入目元素。 在mail.google.com中,控制檯輸出是4個五進制,然後是16個Resource interpreted as Other but transferred with MIME type undefined.每個其他站點只顯示20個五。

任何人都可以解釋這種行爲嗎?

回答

2

您正在腳本中使用全局變量。如果頁面中的腳本使用具有相同名稱的全局變量,它將更改變量中的值,而腳本將顯示該值。

+0

哪個全局變量 - c?上面的代碼是完全未更改的內容腳本 – wezten 2012-01-03 12:01:33

+0

雖然這是真的,但似乎計數器正在工作(OP描述了輸出的20個「塊」),並且即使它已被破壞,這是如何解釋MIME類型的消息? 'c'必須是一個非常非常奇怪的宿主對象,因爲這一切都是有意義的。 – davin 2012-01-03 12:04:31

+1

@jadegem:是的,* c *是全局變量。 @davin:你有一個點在那裏...如果消息的數量不是巧合,那麼唯一可能的原因是'console.log'被重新定義... – Guffa 2012-01-03 12:09:26

1

正如@Guffa所說,您的全局變量可能會被覆蓋。將它包含在閉包中將確保只有您的代碼才能訪問它。

(function() { 
    var c = 0; 

    setTimeout(function f() { 
     if (++c > 20) return; 

     console.log(5); 

     setTimeout(f, 500); 
    }, 500); 
}()); 
+0

我做到了,從你的代碼複製並粘貼。問題更糟,現在只顯示兩次5和18 ...自己嘗試 – wezten 2012-01-03 12:20:40

+0

@jadegem我做了,工作正常。雖然,我只在控制檯中測試過它。但請注意,Chrome會將複製的控制檯輸出壓縮到一行,並在左側添加一個計數。 – 2012-01-03 12:21:25

+0

關掉我的山脈主題,現在它工作正常。嘗試使用山脈主題。不知道它可能是什麼 – wezten 2012-01-03 12:27:15