!function foo()、(function(){}())與(function(){})()
1. (function(){}())與(function(){})()
這兩種寫法,都是一種 立即執(zhí)行函數(shù) 的寫法,即IIFE (Immediately Invoked Function Expression)。這種函數(shù)在函數(shù)定義的地方就直接執(zhí)行了。
通常的函數(shù)聲明和調(diào)用分開(kāi)的寫法如下:
function foo() {/*...*/} // 這是定義,Declaration;定義只是讓解釋器知道其存在,但是不會(huì)運(yùn)行。
foo(); // 這是語(yǔ)句,Statement;解釋器遇到語(yǔ)句是會(huì)運(yùn)行它的。
普通的函數(shù)聲明function foo(){}是不會(huì)執(zhí)行的。這里如果直接這樣寫function foo(){}()解釋器會(huì)報(bào)錯(cuò)的,因?yàn)槭清e(cuò)誤的語(yǔ)法。
IIFE函數(shù)的調(diào)用方式通常是將函數(shù)表達(dá)式、它的調(diào)用操作符、分組操作符放到一個(gè)括號(hào)內(nèi),來(lái)告訴解釋器這里有一個(gè)需要立即執(zhí)行的函數(shù)。否則通常情況下,解析器遇到一個(gè)function關(guān)鍵字,都會(huì)把它當(dāng)做是一個(gè)函數(shù)聲明,而不是函數(shù)表達(dá)式。
如下幾種寫法都是可以的:
(function foo(){/*...*/}());
(function foo(){/*...*/})();
!function foo() {/*...*/}();
+function foo() {/*...*/}();
-function foo() {/*...*/}();
~function foo() {/*...*/}();
在需要表達(dá)式的場(chǎng)景下,就不需要用括號(hào)括起來(lái)了:
void function(){/*...*/}();
var foo = function(){/*...*/}();
true && function () { /*...*/ }();
0, function () { /*...*/ }();
void聲明了不需要返回值,第二個(gè)則將IIFE函數(shù)的返回值賦給了foo。第三、第四個(gè)都是明確需要表達(dá)式的場(chǎng)景,所以解析器會(huì)認(rèn)識(shí)這種寫法。
對(duì)于IIFE函數(shù),也可以給它們傳入?yún)?shù),例如:
(function foo(arg1,arg2,...){...}(param1,param2,...));
對(duì)于常見(jiàn)的
(function( $ ){...})(jQuery);
即是將實(shí)參jQuery傳入函數(shù)function( $ ){},通過(guò)形參 $ 接收。
上述函數(shù)中,最開(kāi)始的那個(gè)括號(hào),可能會(huì)由于js中自動(dòng)分號(hào)插入機(jī)制而引發(fā)問(wèn)題。例如:
a = b + c
;(function () {
// code
})();
如果沒(méi)有第二行的分號(hào),那么該處有可能被解析為c()而開(kāi)始執(zhí)行。所以有的時(shí)候,可能會(huì)看到這樣的寫法:;(function foo(){/…/}()),前邊的分號(hào)可以認(rèn)為是防御型分號(hào)。
2. 第二類是$(function(){});
(function()/.../);是(function()/.../);是(document).ready(function(){/…/})的簡(jiǎn)寫形式,是在DOM加載完成后執(zhí)行的回調(diào)函數(shù),并且只會(huì)執(zhí)行一次。
$( document ).ready(function() {
console.log( "ready!" );
});
和
$(function() {
console.log( "ready!" );
});
起到的效果完全一樣。
在一個(gè)頁(yè)面中不同的js中寫的$(function(){/…/});函數(shù),會(huì)根據(jù)js的排列順序依次執(zhí)行。
相關(guān)文章:
-
帝國(guó)CMS是什么程序 帝國(guó)CMS是一套開(kāi)源的靜態(tài)頁(yè)面程序,憑借超高的擴(kuò)展性,很多知名的新聞?wù)军c(diǎn)、行業(yè)站點(diǎn)都是應(yīng)用的帝國(guó)CMS后端。因?yàn)榈蹏?guó)CMS和dedecms一樣都是生成靜態(tài)頁(yè)面的,所以非常利于...
-
域名解析DNS分為顯性URL和隱形URL,顯性URL和隱形URL有什么區(qū)別?隱形URL和顯性URL哪個(gè)更有利于SEO?顯性URL相當(dāng)于域名了302重定向,隱形URL使用iframe框架技術(shù)隱藏真實(shí)目標(biāo)地址,顯性URL更有利于...
-
在常見(jiàn)的CMS系統(tǒng)中,我對(duì)dedecms算是比較熟悉的,自己網(wǎng)站用的也是這個(gè)系統(tǒng)。系統(tǒng)功能強(qiáng)大使用靈活,相信這也是它受到大多數(shù)中小站長(zhǎng)青睞的原因。 再好的系統(tǒng)也有照顧不周的地方,很多站...
-
這篇文章主要為大家詳細(xì)介紹了dedecms后臺(tái)增加php導(dǎo)出excel功能實(shí)現(xiàn)辦法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,有需要的朋友可以收藏方便以后借鑒。 不少朋友希望織夢(mèng)的后臺(tái)...
-
第一次使用的插件是 pdfobject.js 百度網(wǎng)盤下載地址:http://pan.baidu.com/s/1kUPhYdT 加載 script src=/style/js/pdfobject.js /script script type=text/javascript window.onload = function (){ var success = new PDFObject({ url: pdf文件地...
-
網(wǎng)上有一種方法是copy+unlink來(lái)移動(dòng)文件,但是遇到大文件時(shí)會(huì)消耗大量時(shí)間,對(duì)性能不怎么友好,可以使用rename()來(lái)移動(dòng)文件,速度非???關(guān)于rename()函數(shù) bool rename ( string $oldname , string $newname...
-
基于我們公司可選的幾種推廣方式: 一、關(guān)鍵詞優(yōu)化排名推廣(推薦) 指定關(guān)鍵詞推廣,按天付費(fèi),推廣我們業(yè)務(wù)中最重要的一些關(guān)鍵詞,達(dá)到百度首頁(yè)才收費(fèi),大概一個(gè)關(guān)鍵詞10元/天左右。...
-
插件介紹 wordpress程序網(wǎng)站在發(fā)布文章時(shí)可以給每一片文章添加與之相關(guān)的TAG標(biāo)簽,對(duì)于TAG標(biāo)簽可以生成很多頁(yè)面,增加搜索引擎對(duì)內(nèi)容的抓取量。 WP Auto Keywords插件就是一款能自動(dòng)給文章添加...
-
5.7 生成列表頁(yè) 改動(dòng) include/arc.listview.class.php 1.先設(shè)置 關(guān)閉副欄目(在系統(tǒng)----系統(tǒng)基本參數(shù)性能選項(xiàng)里) 2.一般網(wǎng)站不需要 欄目交叉 交叉 所以 找到94行注釋掉: //獲得交叉欄目ID /*if($this-Type...
-
使用preg_replace將刪除所有空白(包括制表符等) $string = user na me $string = preg_replace(/\s+/, , $string); echo $string; // username preg_replace(/\s/u, ,$string) u (PCRE8) 此修正符打開(kāi)一個(gè)與perl不兼容的附加功能. 模式...