摘要:所以那些匿名函數附近使用括號或一些一元運算符的慣用法,就是來引導解析器,指明運算符附近是一個表達式。
Immediately-invoked Function Expression(IIFE,立即調用函數),簡單的理解就是定義完成函數之后立即執行。因此有時候也會被稱為“自執行的匿名函數”(self-executing anonymous function)。
IIFE的叫法最早見于Ben Alman的文章。文章中Ben Alman 已經解釋得很清楚了,希望定義自執行函數式常見的語法錯誤有兩種:
1) function (){ }()
期望是立即調用一個匿名函數表達式,結果是進行了函數聲明,函數聲明必須要有標識符做為函數名稱。
2) function g(){ }()
期望是立即調用一個具名函數表達式,結果是聲明了函數 g。末尾的括號作為分組運算符,必須要提供表達式做為參數。
所以那些匿名函數附近使用括號或一些一元運算符的慣用法,就是來引導解析器,指明運算符附近是一個表達式。
按照這個理解,可以舉出五類,超過十幾種的讓匿名函數表達式立即調用的寫法:
1)使用括號
( function() {}() ); ( function() {} )(); [ function() {}() ];
2)使用一元操作符
~ function() {}(); ! function() {}(); + function() {}(); - function() {}();
3)使用void等操作符
delete function() {}(); typeof function() {}(); void function() {}();
4)使用表達式
var i = function(){ return 10; }(); 14.true && function(){ /* code */ }(); 15.0, function(){ /* code */ }(); 1 ^ function() {}(); 1 > function() {}();
5)使用new關鍵字
new function(){ /* code */ } 31.new function(){ /* code */ }() //如果沒有參數,最后的()就不需要了
但是總體來說,比較常見的是如下三種寫法:
// Crockford"s preference - parens on the inside (function() { console.log("Welcome to the Internet. Please follow me."); }()); (function() { console.log("Welcome to the Internet. Please follow me."); })(); !function() { console.log("Welcome to the Internet. Please follow me."); }();
其實討論IIFE的多少種寫法多少和研究茴香豆的“茴”字有幾種寫法一樣無聊,但其實不無用處,至少在閱讀別人的代碼時見到這樣的寫法不至于不知所云,抑或可以拿出去和小伙伴們裝裝,頓時覺得逼格提升不少。
參考資料:
http://benalman.com/news/2010/11/immediately-invoked-function-expression/(中文譯文:http://www.cnblogs.com/TomXu/archive/2011/12/31/2289423.html)
http://www.elijahmanor.com/angry-birds-of-javascript-red-bird-iife/(中文譯文:http://nuysoft.com/2013/04/15/angry-birds-of-javascript-red-bird-iife/Immediately-invoked%20Function%20Expression)
http://www.zhihu.com/question/20249179
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/78140.html
摘要:將匿名函數賦予一個變量,叫函數表達式,這是最常見的函數表達式語法形式。組成這是一個被稱為自執行匿名函數的設計模式,主要包含兩部分。 一、函數聲明&函數表達式 1.1 函數聲明 (函數語句) showImg(https://segmentfault.com/img/bVbbqvT?w=278&h=166); (1)使用 function 關鍵字聲明一個函數,再指定一個函數名,叫函數聲明。...
摘要:而且,如果你想跳過這里,你可以直接跳到立即調用函數表達式進行閱讀,但是我建議你讀完整篇文章。當圓括號包裹函數時,它會默認將函數作為表達式去解析,而不是函數聲明。什么是呢它使一個被立即調用的函數表達式。一旦命名,函數將不再匿名。 原文:http://benalman.com/news/2010/11/immediately-invoked-function-expression/#iif...
摘要:第一部分請點擊快速掌握面試基礎知識一閉包閉包由一個函數以及該函數定義是所在的環境組成。當匿名函數執行的時候,的值為。這個問題可以改用后面會介紹方法來解決,通過對每一個匿名函數構建獨立的外部作用域來實現。 譯者按: 總結了大量JavaScript基本知識點,很有用! 原文: The Definitive JavaScript Handbook for your next develope...
摘要:另外,如果你想跳過這里,你可以直接跳到立即調用函數表達式進行閱讀,但是我建議你讀完整篇文章。當圓括號包裹函數時,它會默認將函數作為表達式去解析,而不是函數聲明。 原文:Immediately-Invoked Function Expression (IIFE) by Ben Alman原譯:立即執行函數 by Murphywuwu改增內容: by blanu 也許你沒有注意到,我是一個...
摘要:需要注意的是,及更早的瀏覽器不支持第一種語法中向延遲函數傳遞額外參數的功能。如果在不改變遞歸模式的前提下修善這段代碼解決方案加入定時器題目四考察和系列解釋立即的對象,是在本輪事件循環的結束時,而不是在下一輪事件循環的開始時。 前言:setTimeout是JavaScript中常見的一個window對象方法,本文將介紹關于它的一些基礎知識和易出錯的地方。 1、基礎知識 作用:setTim...
閱讀 1464·2021-11-24 09:39
閱讀 1783·2021-11-22 15:25
閱讀 3736·2021-11-19 09:40
閱讀 3296·2021-09-22 15:31
閱讀 1296·2021-07-29 13:49
閱讀 1205·2019-08-26 11:59
閱讀 1318·2019-08-26 11:39
閱讀 928·2019-08-26 11:00