最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

js立即執(zhí)行函數(shù): (function ( ){})( ) 與 (function ( ){}( )) 有什么區(qū)別?

 更新時間:2015年11月18日 23:19:14   投稿:mdxy-dxy  
這篇文章主要介紹了js立即執(zhí)行函數(shù): (function ( ){})( ) 與 (function ( ){}( )) 有什么區(qū)別,需要的朋友可以參考下

沒有區(qū)別。

你需要明白 IIFE 的原理,我簡單說一下:

復(fù)制代碼 代碼如下:

function foo() {...}     // 這是定義,Declaration;定義只是讓解釋器知道其存在,但是不會運行。
foo();                   // 這是語句,Statement;解釋器遇到語句是會運行它的。

IIFE 并非必須,傳統(tǒng)一點可以這么寫:

復(fù)制代碼 代碼如下:

function foo() {...}
foo();

那么為什么要 IIFE?
1.傳統(tǒng)的方法啰嗦,定義和執(zhí)行分開寫;
2.傳統(tǒng)的方法直接污染全局命名空間(瀏覽器里的 global 對象,如 window)

于是,開發(fā)者們想找一個可以解決以上問題的寫法。那么像下面這么寫行不行呢?

function foo(...){}();

當(dāng)然是不能,但是為什么呢?因為 function foo(...){} 這個部分只是一個聲明,對于解釋器來說,就好像你寫了一個字符串 "function foo(...){}",它需要使用解析函數(shù),比如 eval() 來執(zhí)行它才可以。所以把 () 直接放在聲明后面是不會執(zhí)行,這是錯誤的語法。

如何把它變得正確?說起來也簡單,只要把 聲明 變成 表達式(Expression) 就可以了。

實際上轉(zhuǎn)變表達式的辦法還是很多的,最常見的辦法是把函數(shù)聲明用一對 () 包裹起來,于是就變成了:

復(fù)制代碼 代碼如下:

(function foo() {...})    // 這里是故意換行,實際上可以和下面的括號連起來
();

這就等價于:

復(fù)制代碼 代碼如下:

var foo = function () {...};    // 這就不是定義,而是表達式了。
foo();

但是之前我們說不行的那個寫法,其實也可以直接用括號包起來,這也是一種等價的表達式:

(function foo(){...}());

所以你問有沒有區(qū)別?很簡單:木有~

另外,剛才說過轉(zhuǎn)變表達式的方式很多,的確還有很多別的寫法,比如:

!function foo() {...}();

或者

+function foo() {...}();

這些都可以。

我個人挺偏愛用 void 來轉(zhuǎn)變表達式,因為此關(guān)鍵字不會有返回值。不過這一點真的沒有什么要緊的,就當(dāng)我“龜毛”好了……

復(fù)制代碼 代碼如下:

void function () {
    // 這里是真正需要的代碼
}();

OK,所謂不去污染全局命名空間,是因為 IIFE 創(chuàng)建了一個新的函數(shù)作用域,你真正的業(yè)務(wù)代碼被封裝在其中,自然就不會觸碰到全局對象了。如果你需要全局對象,那就 pass 給 IIFE:

復(fù)制代碼 代碼如下:

void function (global) {
    // 在這里,global 就是全局對象了
}(this)    // 在瀏覽器里,this 就是 window 對象

我在這里寫過一個系列,其中一篇講作用域和命名提升的,里面的知識點對理解 IIFE 有幫助,有興趣的話可以繼續(xù)深入閱讀:http://www.fzitv.net/article/75090.htm

方式一,調(diào)用函數(shù),得到返回值。強制函數(shù)直接量執(zhí)行再返回一個引用,引用在去調(diào)用執(zhí)行
方式二,調(diào)用函數(shù),得到返回值。強制運算符使函數(shù)調(diào)用執(zhí)行
(function(){})(); 是 把函數(shù)當(dāng)作表達式解析,然后執(zhí)行解析后的函數(shù)
相當(dāng)于 var a = function(){}; a(); a得到的是函數(shù)
(function(){}()); 是把函數(shù)表達式和執(zhí)行當(dāng)作語句直接執(zhí)行、
相當(dāng)于 var a = function(){}(); a得到的是結(jié)果
最終結(jié)果是一樣的、
()只是起了 自執(zhí)行的作用
和 () 一樣的還有很多
比如 +function (){}
這個等于 (function (){}) 一般用(function (){}) 還有個作用,就是 避免全局變量

相關(guān)文章

  • 原生JS獲取元素集合的子元素寬度實例

    原生JS獲取元素集合的子元素寬度實例

    本文主要對原生JS獲取元素集合的子元素寬度的實現(xiàn)方法進行介紹,代碼詳細,具有很好的參考價值,需要的朋友一起來看下吧
    2016-12-12
  • 實例詳解JavaScript靜態(tài)作用域和動態(tài)作用域

    實例詳解JavaScript靜態(tài)作用域和動態(tài)作用域

    作用域是指程序源代碼中定義變量的區(qū)域,作用域規(guī)定了如何查找變量,也就是確定當(dāng)前執(zhí)行代碼對變量的訪問權(quán)限,這篇文章主要給大家介紹了關(guān)于JavaScript靜態(tài)作用域和動態(tài)作用域的相關(guān)資料,需要的朋友可以參考下
    2021-10-10
  • 返回對象在當(dāng)前級別中是第幾個元素的實現(xiàn)代碼

    返回對象在當(dāng)前級別中是第幾個元素的實現(xiàn)代碼

    我就是想怎么獲取 每個層 相對于父級層 是第幾個,需要的朋友可以參考下。
    2011-01-01
  • JavaScript伸縮的菜單簡單示例

    JavaScript伸縮的菜單簡單示例

    伸縮的菜單,想必大家都有見到過吧,實現(xiàn)方法也是很多的,在接下來的文章中為大家介紹下使用js是如何實現(xiàn)的,需要的朋友可以參考下
    2013-12-12
  • Javascript 鼠標移動上去 滑塊跟隨效果代碼分享

    Javascript 鼠標移動上去 滑塊跟隨效果代碼分享

    這篇文章主要介紹了Javascript 鼠標移動上去 滑塊跟隨效果代碼,有需要的朋友可以參考一下
    2013-11-11
  • javascript 特性檢測并非瀏覽器檢測

    javascript 特性檢測并非瀏覽器檢測

    NCZ在他的同名博客《Feature detection is not browser detection》中,講述了一直以來前端開發(fā)中的一個熱門技術(shù)——檢測用戶的瀏覽器平臺,并詳細地敘說歷史發(fā)展以及各種辦法的優(yōu)缺點。
    2010-01-01
  • electron的webview和內(nèi)嵌網(wǎng)頁通信的方法

    electron的webview和內(nèi)嵌網(wǎng)頁通信的方法

    在 Electron 的世界里,webview 標簽相當(dāng)于一個小盒子,里面可以裝一個完整的網(wǎng)頁,就像一個迷你瀏覽器,這篇文章主要介紹了electron的webview和內(nèi)嵌網(wǎng)頁如何通信,需要的朋友可以參考下
    2024-04-04
  • js打字機效果代碼

    js打字機效果代碼

    大家經(jīng)常用js實現(xiàn)打字機效果,最近發(fā)現(xiàn)這個不錯
    2008-06-06
  • 詳解javascript如何在跨域請求中攜帶cookie

    詳解javascript如何在跨域請求中攜帶cookie

    本文主要介紹了詳解javascript如何在跨域請求中攜帶cookie,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • JS中FormData類實現(xiàn)文件上傳

    JS中FormData類實現(xiàn)文件上傳

    這篇文章主要為大家詳細介紹了JS中FormData類實現(xiàn)文件上傳功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-03-03

最新評論

财经| 吴江市| 紫阳县| 鹰潭市| 崇州市| 读书| 凤阳县| 泗阳县| 贞丰县| 泸州市| 观塘区| 罗甸县| 资阳市| 阜平县| 离岛区| 高青县| 江川县| 阿城市| 犍为县| 运城市| 罗甸县| 凤翔县| 明光市| 蓝田县| 兴隆县| 磐安县| 台北市| 赣榆县| 龙门县| 江安县| 磴口县| 铜山县| 巴青县| 寿阳县| 乌海市| 伊吾县| 海林市| 托克逊县| 安达市| 宁波市| 黔西县|