1. 程式人生 > >深入理解立即執行函式(function(){})();

深入理解立即執行函式(function(){})();

( function(){…} )()和( function (){…} () )是兩種javascript立即執行函式的常見寫法,要理解立即執行函式,需要先理解一些函式的基本概念。

1,函式宣告,函式表示式,匿名函式

函式宣告function fnName(){...};使用function關鍵字宣告一個函式,再指定一個函式名,叫函式宣告。

函式表示式var fnName = function(){...};使用function關鍵字宣告一個函式,但未給函式命名,最後將匿名函式賦給一個變數,叫函式表示式。這是最常見的函式表示式語法形式。

匿名函式function(){...};使用function關鍵字宣告一個函式,但是並沒有給函式命名,所有叫匿名函式。(匿名函式屬於函式表示式,匿名函式有很多作用,賦予一個變數則建立函式,賦予一個事件則成為事件處理程式或建立閉包)

函式宣告和函式表示式不同在於:

1,javascript引擎在解析javascript程式碼時會函式宣告提升(function declaretion hoisting)當前執行環境(作用域)上的函式宣告。而函式表示式必須等到Javascript引擎執行到他所在行時,才會從上而下一行一行的解析函式表示式。

2,函式表示式後面可以加括號立即呼叫函式,函式宣告不可以,只能以fnName()呼叫。例:

fnName();

function fnName(){

 ...

}

//正常,因為提升'了函式宣告,函式呼叫可在函式宣告之前

fnName();

var fnName=function(){

 ...

}

//報錯,變數fnName還未儲存對函式的引用,函式呼叫必須在函式表示式之後

var fnName=function(){

 alert('Hello World');

}();

//函式表示式後面加括號,當javascript引擎解析到此處時能立即呼叫函式

function fnName(){

 alert('Hello World');

}();

//不會報錯,但是javascript引擎只解析函式宣告,忽略後面的括號,函式宣告不會被呼叫

function(){

 console.log('Hello World');

}();

//語法錯誤,雖然匿名函式屬於函式表示式,但是未進行賦值操作,

//所以javascript引擎將開頭的function關鍵字當做函式宣告,報錯:要求需要一個函式名

要在函式體後面加括號就能立即呼叫,則這個函式必須是函式表示式,不能是函式宣告。(即只要是函式表示式,即可以在後面新增括號來立即執行函式)

(function(a){

 console.log(a); //firebug輸出123,使用()運算子

})(123);

(function(a){

 console.log(a); //firebug輸出1234,使用()運算子

}(1234));

!function(a){

 console.log(a); //firebug輸出12345,使用!運算子

}(12345);

+function(a){

 console.log(a); //firebug輸出123456,使用+運算子

}(123456);

-function(a){

 console.log(a); //firebug輸出1234567,使用-運算子

}(1234567);

var fn=function(a){

 console.log(a); //firebug輸出12345678,使用=運算子

}(12345678)

可以對比輸出結果,在function後面加!,+-甚至是逗號都可以起到函式定義後立即執行的效果。而這些符號都將函式宣告傳換成函式表示式。顧可以在其後面加括號,並立即執行函式

但是加括號是最安全的做法,因為其他運算子還會和函式的返回值進行運算,有時造成不必要的麻煩。

不過這樣的寫法有什麼用呢?

javascript中沒用私有作用域的概念,如果在多人開發的專案上,你在全域性或區域性作用域中聲明瞭一些變數,可能會被其他人不小心用同名的變數給覆蓋掉,根據javascript函式作用域鏈的特性,可以使用這種技術可以模仿一個私有作用域,用匿名函式作為一個“容器”,“容器”內部可以訪問外部的變數,而外部環境不能訪問“容器”內部的變數,所以( function(){…} )()內部定義的變數不會和外部的變數發生衝突,俗稱“匿名包裹器”或“名稱空間”。

JQuery使用的就是這種方法,將JQuery程式碼包裹在( function (window,undefined){…jquery程式碼…} (window)中,在全域性作用域中呼叫JQuery程式碼時,可以達到保護JQuery內部變數的作用。

相關推薦

深入理解立即執行函式(function(){})();

( function(){…} )()和( function (){…} () )是兩種javascript立即執行函式的常見寫法,要理解立即執行函式,需要先理解一些函式的基本概念。 1,函式宣告,函式表示式,匿名函式 函式宣告:function fnName(){...};使用function關鍵字宣告一個

深入理解javascript中的立即執行函式(function(){…})()

javascript和其他程式語言相比比較隨意,所以javascript程式碼中充滿各種奇葩的寫法,有時霧裡看花,當然,能理解各型各色的寫法也是對javascript語言特性更進一步的深入理解。 ( function(){…} )()和( function (){…}

[轉]深入理解javascript中的立即執行函式(function(){…})()

( function(){…} )()和( function (){…} () )是兩種javascript立即執行函式的常見寫法,最初我以為是一個括號包裹匿名函式,再在後面加個括號呼叫函式,最後達到函式定義後立即執行的目的,後來發現加括號的原因並非如此。要理解

深入理解JavaScript中的立即執行函式(function(){……})()

前言:這篇文章主要介紹了深入理解javascript中的立即執行函式,立即執行函式也叫立即呼叫函式,通常它的寫法是用(function(){…})()包住業務程式碼,使用jquery時比較常見,需要的朋友可以參考下 立即執行函式表示式IIFE 作用:IIFE最常用的功

JavaScript 函數聲明,函數表達式,匿名函數的區別,深入理解立即執行函數(function(){…})()

之前 事件處理程序 logs cnblogs 函數調用 引擎 花括號 ava img function fnName(){xxxx}; // 函數聲明:使用function關鍵字聲明一個函數,在指定一個函數名。 //例如:(正常,因為 提升 了函數聲明,函

javascript中的立即執行函式(function(){…})()

javascript和其他程式語言相比比較隨意,所以javascript程式碼中充滿各種奇葩的寫法,有時霧裡看花,當然,能理解各型各色的寫法也是對javascript語言特性更進一步的深入理解。 ( function(){…} )()和( function (){…} () )是兩種javasc

js立即執行函式: (function ( ){})( ) 與 (function ( ){}( )) 有什麼區別?

這篇文章主要介紹了js立即執行函式: (function ( ){})( ) 與 (function ( ){}( )) 有什麼區別,需要的朋友可以參考下 沒有區別。 你需要明白 IIFE 的原理,我簡單說一下: 複製程式碼 程式碼如下: function foo() {...} &

JS-立即執行函式(function(){...})() && (function(){...})()

在學習閉包的過程中遇到了(立即執行),之前見到(function(){...})() && (function(){...}())這種寫法,就沒有去知其所以然,也不會去寫這種函式。所以一直害怕js,但還是要學習瞭解的,基本概念一定都要知道,才能自己造輪子,而不

js立即執行函式(function ( ){})( ) 與 (function ( ){}( )) 區別

結論:沒有區別。 下面說下立即執行函式表示式(IIFE)的原理: function foo(){...} //這是函式定義,直譯器遇到它的時候,不會執行; foo(); //這是語句,直譯器遇到語句會執行它。這種寫法是傳統寫法,定義和執行分開,也很好理解。那為什麼還要有

深入理解JS立即執行函式

1.什麼是立即執行函式(IIFE) 在瞭解立即執行函式之前先明確一下函式宣告、函式表示式及匿名函式的形式,如下圖: 接下來看立即執行函式的兩種常見形式: ( function(){…} )()  和  ( function (){…} () ) ,一個是一個匿名函式包裹在一個括號運

js中(function(){…})()立即執行函式寫法理解

javascript和其他程式語言相比比較隨意,所以javascript程式碼中充滿各種奇葩的寫法,有時霧裡看花,當然,能理解各型各色的寫法也是對javascript語言特性更進一步的深入理解。 ( function(){…} )()和( function (){…} ()

二、JAVA多執行緒:深入理解Thread建構函式(Thread、Runnable、守護執行緒、ThreadGroup)

本章主要介紹了所有與Thread有關的建構函式,執行緒的父子關係(並非繼承關係,而是一種包含關係),Thread和ThreadGroup之間的關係,Thread與虛擬機器棧的關係(學習這部分內容需要讀者有JVM的相關基礎,尤其是對棧記憶體要有深入的理解),最後還介紹了守護執行緒的概念、特點和使用場景

立即執行函式(IIFE)的理解與運用

作為JavaScript的常用語法,立即執行函式IIFE(Immediately-Invoked Function Expression)是值得我們認真去學習探究的。 一、建立函式的兩種方式 我們先從基礎講起,要建立一個JS函式,有兩種方式。

深入理解C++虛擬函式底層機制和RTTI執行時型別識別

    當呼叫一個虛擬函式時,被執行的程式碼必須與呼叫函式物件的動態型別相一致:指向物件的指標或引用的型別是不重要的,編譯器是如何高效地提供這種行為呢?大多數編譯器是使用virtual table和virtual table pointers(vtbl和vptr)。    

javascript中奇怪的執行結果(立即執行函式

在下面的例子中,將IIFE賦值給一個變數message。message返回另外一個函式,該函式只是簡單地輸出變數x的值。有趣的事情是,當我們把變數x的初始值作為引數傳入函式時,可以在函式執行時所建立的閉包中捕獲變數x的值。無論在外部作用域中x的值發生了什麼變化,閉包將記住函式執行時變數x的值

深入理解Javascript箭頭函式中的this

今日頭條:https://m.jb51.net/article/105340.htm 新增連結描述 ES6標準新增了一種新的函式:Arrow Function(箭頭函式)。那麼下面這篇文章主要給大家介紹了箭頭函式中this的相關資料,有需要的朋友可以參考借鑑,下面來一起看看吧。 首先我們先看

day22 立即執行函式

1、Javascript引擎在解析程式碼時會將函式宣告提升到當前執行期上下文(作用域),而函式表示式必須等到Javascirtp引擎執行到它所在行時,才會從上而下一行一行地解析函式表示式; 2、只有表示式能被執行符號()執行,執行完立即銷燬。 立即執行函式的格式: 1、 ( func

深入理解執行緒(四)—— Moniter的實現原理

在深入理解多執行緒(一)——Synchronized的實現原理中介紹過關於Synchronize的實現原理,無論是同步方法還是同步程式碼塊,無論是ACC_SYNCHRONIZED還是monitorenter、monitorexit都是基於Monitor實現的,那麼這篇來介紹下什麼是Monitor。

js---作用域鏈,立即執行函式,閉包

1.作用域鏈----函式 定義時會獲得 父級的作用域鏈的值放在自己的 [[Scopes]]屬性中, [[Scopes]]是系統自帶的隱式屬性,通過console.dir(函式名)   可以檢視這個函式的作用域鏈,即 [[Scopes]]。任何函式都至少會

JavaScript中立即執行函式例項詳解 轉載 作者:李牧羊

javascript和其他程式語言相比比較隨意,所以javascript程式碼中充滿各種奇葩的寫法,有時霧裡看花,當然,能理解各型各色的寫法也是對javascript語言特性更進一步的深入理解。這篇文章主要給大家介紹了關於JavaScript中立即執行函式的相關資料,需要的朋友可以參考下。 前言