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


一般看JQuery插件里的寫法是這樣的

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

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

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

為什么要在前面加一個 " ! " 呢?


 

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

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

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

但是,如果我們嘗試為一個“定義函數”末尾加上(),解析器是無法理解的。

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

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

如果將函數體部分用()包裹起來就可以運行並且解析器是不報錯的,如:

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

那為什么將函數體部分用()包裹起來就可以了呢?

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

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

這些有一篇非常詳細的文章,推薦閱讀: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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM