從語法上來開。Javascript中分號(hào)表示語句結(jié)束,在開頭加上??赡苁菫榱藟嚎s的時(shí)候和別的方法切割一下,表示一個(gè)新的語句開始。所以,假設(shè)在一個(gè)單獨(dú)的JS文件里。開頭的分號(hào)是沒有不論什么意義的,能夠刪掉。
嘆號(hào)是邏輯運(yùn)算符,是“非”的意思,常見這樣的寫法 if(!true){}。而將運(yùn)算符載入函數(shù)定義的前面,則是將函數(shù)看做一個(gè)總體。然后再調(diào)用這個(gè)函數(shù)。并對(duì)返回的結(jié)構(gòu)進(jìn)行邏輯運(yùn)算。
說白了,此處就是構(gòu)建了一個(gè)馬上運(yùn)行函數(shù),建議樓主知道意思就能夠。自己寫的時(shí)候,能夠使用更清晰的格式:
一般看JQuery插件里的寫法是這樣的
(function($) { //... })(jQuery);
今天看到bootstrap的javascript組件是這樣寫的
!function( $ ){ //... }( window.jQuery );
為什么要在前面加一個(gè) " ! " 呢?
我們都知道,函數(shù)的聲明方式有這兩種
function fnA(){alert('msg');}//聲明式定義函數(shù)var fnB = function(){alert('msg');}//函數(shù)賦值表達(dá)式定義函數(shù)
樓主問題中出現(xiàn)的兩個(gè)函數(shù),都是匿名函數(shù)。通常,我們調(diào)用一個(gè)方法的方式就是 FunctionName()
但是,如果我們嘗試為一個(gè)“定義函數(shù)”末尾加上(),解析器是無法理解的。
function msg(){ alert('message'); }();//解析器是無法理解的
定義函數(shù)的調(diào)用方式應(yīng)該是 msg() ;
如果將函數(shù)體部分用()包裹起來就可以運(yùn)行并且解析器是不報(bào)錯(cuò)的,如:
(function($) { //... })(jQuery);
那為什么將函數(shù)體部分用()包裹起來就可以了呢?
原來,使用括號(hào)包裹定義函數(shù)體,解析器將會(huì)以函數(shù)表達(dá)式的方式去調(diào)用定義函數(shù)。也就是說,任何能將函數(shù)變成一個(gè)函數(shù)表達(dá)式的作法,都可以使解析器正確的調(diào)用定義函數(shù)。而 ! 就是其中一個(gè),而 + - || 都有這樣的功能。
另外,用 ! 可能更多的是一個(gè)習(xí)慣問題,不同的運(yùn)算符,性能是不同的。
就是為了能省略一個(gè)字符……
// 這么寫會(huì)報(bào)錯(cuò),因?yàn)檫@是一個(gè)函數(shù)定義:function() {}()// 常見的(多了一對(duì)括號(hào)),調(diào)用匿名函數(shù): (function() {})()// 但在前面加上一個(gè)布爾運(yùn)算符(只多了一個(gè)感嘆號(hào)),就是表達(dá)式了,將執(zhí)行后面的代碼,也就合法實(shí)現(xiàn)調(diào)用 !function() {}()
在前面加上~+-等一元操作符也可以。。其實(shí)還有好幾種符合都可以保證匿名函數(shù)聲明完就立即執(zhí)行
var hi = function(){ alert("hi") };
hi();
等于...
(function(){ alert("hi") })();
!、+和()一樣的效果可以把換成
!function(){ alert("hi") }();
!比()節(jié)省一個(gè)字符,或者說比()好看些
我們都知道分號(hào)是為了和前面的代碼隔開,js可以用換行分隔代碼,但是合并壓縮多個(gè)js文件之后,換行符一般會(huì)被刪掉,所以連在一起可能會(huì)出錯(cuò),加上分號(hào)就保險(xiǎn)了。 你看到的感嘆號(hào),一般是在壓縮過的js文件里面,因?yàn)樵谀涿瘮?shù)調(diào)用的時(shí)候,通常我們都是用: (function(){})() 的形式,但也可以使用另一種形式:!function(){}() 前面的!號(hào)可以換成-+~等等一元操作符,從而省下了1字節(jié)。
如對(duì)本文有疑問,請(qǐng)?zhí)峤坏浇涣髡搲?,廣大熱心網(wǎng)友會(huì)為你解答??! 點(diǎn)擊進(jìn)入論壇