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 在這種情況下,真與假的含義是什麼?
@Quentin感謝您的快速反應,我想這正是我所期待的。 –
@Quentin,你能發表一個快速回答指出另一個問題嗎?我不認爲這是完全相同的重複:我的印象是,'
如果沒有編號爲
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
。來源
2012-10-24 17:05:02
對不起,我想你已經回答了,好像我很好奇第二個'!'。請注意,我問的是翻轉「這種自我調用功能」的回報,而且總體上這個問題的範圍圍繞整個「
相關問題