js函數前加分號和感嘆號是什麼意思?有什麼用?

通常看JQuery插件裏的寫法是這樣的javascript

(function($) { //... })(jQuery);

今天看到bootstrap的javascript組件是這樣寫的java

!function( $ ){ //... }( window.jQuery );

爲何要在前面加一個 " ! " 呢?bootstrap


 

咱們都知道,函數的聲明方式有這兩種segmentfault

function fnA(){alert('msg');}//聲明式定義函數 var fnB = function(){alert('msg');}//函數賦值表達式定義函數 

樓主問題中出現的兩個函數,都是匿名函數。一般,咱們調用一個方法的方式就是 FunctionName()函數

可是,若是咱們嘗試爲一個「定義函數」末尾加上(),解析器是沒法理解的。性能

function msg(){ alert('message'); }();//解析器是沒法理解的 

定義函數的調用方式應該是 msg() ;ui

若是將函數體部分用()包裹起來就能夠運行而且解析器是不報錯的,如:url

(function($) { //... })(jQuery);

那爲何將函數體部分用()包裹起來就能夠了呢?spa

原來,使用括號包裹定義函數體,解析器將會以函數表達式的方式去調用定義函數。也就是說,任何能將函數變成一個函數表達式的做法,均可以使解析器正確的調用定義函數。而 ! 就是其中一個,而 + - || 都有這樣的功能。插件

另外,用 ! 可能更多的是一個習慣問題,不一樣的運算符,性能是不一樣的。

這些有一篇很是詳細的文章,推薦閱讀:http://www.swordair.com/blog/2011/10/...


 

就是爲了能省略一個字符……

// 這麼寫會報錯,由於這是一個函數定義:
function() {}() // 常見的(多了一對括號),調用匿名函數: (function() {})() // 但在前面加上一個布爾運算符(只多了一個感嘆號),就是表達式了,將執行後面的代碼,也就合法實現調用 !function() {}()

在前面加上~+-等一元操做符也能夠。。其實還有好幾種符合均可以保證匿名函數聲明完就當即執行


var hi = function(){ alert("hi") };
hi();
等於...
(function(){ alert("hi") })();
!、+和()同樣的效果能夠把換成
!function(){ alert("hi") }();
!比()節省一個字符,或者說比()好看些



咱們都知道分號是爲了和前面的代碼隔開,js能夠用換行分隔代碼,可是合併壓縮多個js文件以後,換行符通常會被刪掉,因此連在一塊兒可能會出錯,加上分號就保險了。

你看到的感嘆號,通常是在壓縮過的js文件裏面,由於在匿名函數調用的時候,一般咱們都是用: (function(){})() 的形式,但也可使用另外一種形式:!function(){}() 前面的!號能夠換成-+~等等一元操做符,從而省下了1字節。

出處參考:

http://segmentfault.com/q/1010000000117476

http://zhidao.baidu.com/link?url=TZRm5eIm5YT6CPEb-w9i0NiplFRH19kwfkJ6HCjsTY863Ty2w2Uburgx1OCBjvhxNqYxpDUfkUNts2A_72st-npOmvO5phokO88ksVWdRBu

相關文章
相關標籤/搜索