2012-10-24 38 views
4

可能重複:
What does the exclamation mark do before the function?爲什麼這個Twitter腳本標籤試圖評估爲真?有關係嗎?

我保持現有的網站與 「鳴叫」 按鈕,這似乎來自this page

一名同事帶到這裏來了很好的問題:爲什麼這個腳本標記會顛倒這個自調用函數的(undefined,通過no return語句)值? (漂亮,田間爲了便於閱讀,原來是在鏈接)

<script> 
    !function(d,s,id) { 
//^--- that 
    var js,fjs=d.getElementsByTagName(s)[0]; 
    if(!d.getElementById(id)) { 
     js=d.createElement(s); 
     js.id=id; 
     js.src="https://platform.twitter.com/widgets.js"; 
     fjs.parentNode.insertBefore(js,fjs); 
    } 
    }(document,"script","twitter-wjs"); 
</script> 

要我非JS-PRO的眼睛,這似乎是翻轉的undefined布爾值,從而使整個<script>標籤,以評估真正。對於它的價值,對我來說這是一個完全陌生的想法(即<script>標記具有表達式值)。

我的期望是有一些特定的瀏覽器,其中<script>標籤的布爾值(是的,我覺得即使打字也很瘋狂)很重要。

所以基本的問題是這樣的:<script>是否對任何你知道的瀏覽器有一個有意義的「表達」值? and 在這種情況下,真與假的含義是什麼?

+0

@Quentin感謝您的快速反應,我想這正是我所期待的。 –

+0

@Quentin,你能發表一個快速回答指出另一個問題嗎?我不認爲這是完全相同的重複:我的印象是,'

0

如果沒有編號爲twitter-wjs的腳本元素,此代碼將創建一個新的腳本標記並將其添加到類型腳本的第一個元素之前。

由於!是在Javascript NOT運算符,它的計算結果爲true時它的操作數可以被轉換成false(在這種情況下,當ID爲twitter-wjs存在,document.getElementById("twitter-wjs")返回undefined沒有元件,這在Javascript是falsey值這樣的結果與!運營商一起將true和代碼if內側各塊得到執行。在Javascript中的任何對象將是true其布爾值檢查時(嘗試做!![Object],你會證明這一點),所以if塊當任何元素被document.getElementById()返回時不會被執行。

UPDATE:
關於你的評論,我看到@JeremyJStarcher答案是好的,但我加入了一句:
在你的代碼有function expression。對於function expressions,不需要標識符。但是執行時,Javascript解釋器可能會混淆並將其視爲function declaration。在function declarations中,標識符不是可選的,因此解釋器將引發語法錯誤。爲避免這種情況,在此使用!運營商,因此它將被視爲function expression

+0

對不起,我想你已經回答了,好像我很好奇第二個'!'。請注意,我問的是翻轉「這種自我調用功能」的回報,而且總體上這個問題的範圍圍繞整個「

  • 11. 爲什麼這些xsl:當測試總是被評估爲false?
  • 12. 爲什麼這總是評估錯誤?
  • 13. 批處理腳本:爲什麼此條件評估爲true?
  • 14. 在java腳本中評估struts2標籤
  • 15. 這個腳本標籤是什麼?
  • 16. 評估這個的順序是什麼?爲什麼? C++
  • 17. 爲什麼這個mathematica模式變量沒有被評估?
  • 18. 爲什麼這個嵌入式ruby代碼沒有評估?
  • 19. 爲什麼沒有這個引號形式評估預期
  • 20. 這個表達式評估什麼? (bash shell腳本)
  • 21. 爲什麼這個表達式評估爲false?
  • 22. 爲什麼這個JavaScript表達式評估爲false?
  • 23. 爲什麼這個表達式繼續評估爲0
  • 24. 爲什麼這個左連接評估爲交叉連接?
  • 25. 爲什麼這兩個表達式評估爲不同的值?
  • 26. 爲什麼這個表達式在JavaScript中被評估爲「a」?
  • 27. 爲什麼while循環永遠不會評估爲真?
  • 28. 爲什麼我的Perl條件總是評估爲真?
  • 29. 爲什麼「(奇數和1)= 1」評估爲真?
  • 30. string.find()總是評估爲真