摘要:匿名函數(shù)的好處在于可以減少局部變量,以免污染現(xiàn)有的運行環(huán)境。另外通過,這三個符號運行的匿名函數(shù)比運行的匿名函數(shù)可以減少一個字符的使用但是我們通常使用加因為其他的操作符可能會帶來其他的影響更多可以參考
js中的立即執(zhí)行函數(shù)
( function(){…} )()和( function (){…} () )是兩種javascript立即執(zhí)行函數(shù)的常見寫法
問題:為什么會出現(xiàn)上面的兩種不一樣的寫法,上面的寫法難道不是簡單的就是一個括號包裹匿名函數(shù)對象,再在后面加個括號調用函數(shù),最后達到函數(shù)定義后立即執(zhí)行的目的????然而并不是我想的那么簡單
除了這兩種常用的方式: (function(){ //do something here; })(); ( function (){//do something here; }}()); 還有一種方式為: !function(){ // do something }();
在這里開頭要加上 ! 或者 ~ , - 和 +。(都是英文符號)
為什么這里要這樣子,為什么要在前面加上()、!、+、-、=等運算符????
因為 JavaScript 文法明確規(guī)定表達式語句不得以 function 或者 {
為開頭(http://es5.github.io/#x12.4)
ExpressionStatement → [lookahead ? {{, function}] Expression;好的現(xiàn)在帶來更多的困惑了......
首先想要明白這個問題需要弄清函數(shù)表達式(function expression)和函數(shù)聲明(function declaration)的區(qū)別:
函數(shù)表達式:函數(shù)表達式中的函數(shù)可以為匿名函數(shù),也可以有函數(shù)名,但是該函數(shù)實際上不能直接使用,只能通過表達式左邊的變量 a 來調用。
var a = function(){ alert("Function expression"); }; var b = new a();函數(shù)聲明:
// 函數(shù)聲明時必須有函數(shù)名
function a(){ alert("Function declaration"); } a();下面來看一下這段代碼:
~function() { console.log("hi"); } ();
實際上可以分為兩個部分(~function() { console.log("hi")} 和()部分)前面部分的匿名函數(shù)通過一元操作符變成了函數(shù)表達式,因而可以通過在表達式的后面使用 () 來執(zhí)行 。
因此,執(zhí)行匿名函數(shù)可以通過+,-,!,() 這里的括號也是一種運算符,稱為分組運算符
這樣的形式來轉化為函數(shù)表達式,就可以通過表達式的后面使用 () 來執(zhí)行
( function() {}() ); ( function() {} )(); [ function() {}() ]; ~ function() {}(); ! function() {}(); + function() {}(); - function() {}(); delete function() {}(); typeof function() {}(); void function() {}(); new function() {}(); new function() {}; var f = function() {}(); 1, function() {}(); 1 ^ function() {}(); 1 > function() {}();下面看一個組錯誤的的現(xiàn)象:
function (){console.log("hi")}(); VM354:1 Uncaught SyntaxError: Unexpected token ) function g(){ console.log("hi")}(); VM519:1 Uncaught SyntaxError: Unexpected token )(1) function (){ }()
期望是立即調用一個匿名函數(shù)表達式,結果是進行了函數(shù)聲明,函數(shù)聲明必須要有標識符做為函數(shù)名稱,而這里用()來做為標識符是非法的.
(2) function g(){ }()期望是立即調用一個具名函數(shù)表達式,結果是聲明了函數(shù) g。末尾的括號作為分組運算符,必須要提供表達式做為參數(shù)。
function g(){ console.log("hi")}(1); >1
所以那些匿名函數(shù)附近使用括號或一些一元運算符的慣用法,就是來引導解析器,指明運算符附近是一個表達式。
匿名函數(shù)的好處在于:可以減少局部變量,以免污染現(xiàn)有的運行環(huán)境。jQuery等庫都用到了這樣的原理。
另外:通過+,-!這三個符號運行的匿名函數(shù)比()運行的匿名函數(shù)可以減少一個字符的使用,但是我們通常使用加(),因為其他的操作符可能會帶來其他的影響
更多可以參考
ECMA-262-3 in detail. Chapter 5. Functions.
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://www.ezyhdfw.cn/yun/86416.html
摘要:函數(shù)防抖的要點,是需要一個來輔助實現(xiàn),延遲運行需要執(zhí)行的代碼。若計時期間事件沒有被重新觸發(fā),等延遲時間計時完畢,則執(zhí)行目標代碼。而非立即執(zhí)行版指的是觸發(fā)事件后函數(shù)會立即執(zhí)行,然后秒內不觸發(fā)事件才能繼續(xù)執(zhí)行函數(shù)的效果。。 JS中的函數(shù)防抖 一、什么是函數(shù)防抖 概念:函數(shù)防抖(debounce),就是指觸發(fā)事件后,在 n 秒內函數(shù)只能執(zhí)行一次,如果觸發(fā)事件后在 n 秒內又觸發(fā)了事件,則會重...
摘要:模仿塊級作用域立即執(zhí)行函數(shù)前言最近在細讀高級程序設計,對于我而言,中文版,書中很多地方一筆帶過,所以用自己所理解的,嘗試細致解讀下。語法如下這里是塊級作用域以上代碼定義并立即調用了一個匿名函數(shù)。 模仿塊級作用域-立即執(zhí)行函數(shù) 前言:最近在細讀Javascript高級程序設計,對于我而言,中文版,書中很多地方一筆帶過,所以用自己所理解的,嘗試細致解讀下。如有紕漏或錯誤,會非常感謝您的指...
摘要:模塊化里的和閉包與立即執(zhí)行函數(shù)的使用這篇文章記錄我寫在線個人簡歷過程中學習的知識完整代碼暫未完成預覽地址輪播組件的使用英文官網中文網使用方法模塊化學習寫代碼的方法抄運行修改模塊化把對應功能放到塊里面這個塊可以是文件或者或者別的等等立即執(zhí) 模塊化、MVC里的V和C、閉包與立即執(zhí)行函數(shù)的使用 這篇文章記錄我寫在線個人簡歷過程中學習的知識完整代碼(暫未完成)預覽地址 輪播Swiper組件的使...
摘要:匿名函數(shù)是不能單獨寫的,所以就提不上立即執(zhí)行了。六立即執(zhí)行函數(shù)在閉包中的應用立即執(zhí)行函數(shù)能配合閉包保存狀態(tài)。來看下上節(jié)內容中閉包的例子現(xiàn)在,我們來利用立即執(zhí)行函數(shù)來簡化它第一個匿名函數(shù)執(zhí)行完畢后,返回了第二個匿名函數(shù)。 前面的閉包中,提到與閉包相似的立即執(zhí)行函數(shù),感覺兩者還是比較容易弄混吧,嚴格來說(因為犀牛書和高程對閉包的定義不同),立即執(zhí)行函數(shù)并不屬于閉包,它不滿足閉包的三個條件。...
摘要:瀏覽器是多進程的,而瀏覽器的內核渲染進程是多線程的。如果已經將回調函數(shù)放進任務隊列,但是主線程正在執(zhí)行一個非常耗時的任務,當這個任務執(zhí)行完畢后,主線程去任務隊列中取任務,這個時候,就會出現(xiàn)連續(xù)執(zhí)行的情況,也就是說相當于失效了。 前言 ??在刷筆試題的時候,經常會碰到setTimeout的問題,只知道這個是設置定時器;但是考察的重點一般是在一個方法中包含了定時器,定時器中的打印和方法中打...
閱讀 754·2023-04-26 01:53
閱讀 2853·2021-11-17 17:00
閱讀 2978·2021-09-04 16:40
閱讀 2076·2021-09-02 15:41
閱讀 926·2019-08-26 11:34
閱讀 1310·2019-08-26 10:16
閱讀 1421·2019-08-23 17:51
閱讀 929·2019-08-23 16:50