1. 程式人生 > >JS-立即執行函式(function(){...})() && (function(){...})()

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

在學習閉包的過程中遇到了(立即執行),之前見到(function(){...})() && (function(){...}())這種寫法,就沒有去知其所以然,也不會去寫這種函式。所以一直害怕js,但還是要學習瞭解的,基本概念一定都要知道,才能自己造輪子,而不是一味地使用他人的,這篇借鑑了別人的,但已經都get了,因此,記個筆記,讓自己記得更牢,包括之後的閉包,呼叫。

javascript是弱型別的,較於其他程式語言,比較隨意。( function(){…} )()( function (){…} () )是兩種javascript立即執行函式的常見寫法,要理解立即執行函式,需要先理解一些函式的基本概念。

1、函式宣告;2、匿名函式;3、函式表示式

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

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

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

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

一、JS引擎在解析javascript程式碼時會‘函式宣告提升’(Function declaration Hoisting)當前執行環境(作用域)上的函式宣告,而函式表示式必須等到JS引擎執行到它所在行時,才會從上而下一行一行地解析函式表示式;

二、函式表示式後面可以加括號立即呼叫該函式,函式宣告不可以,只能以fnName()形式呼叫 。

以下是兩者差別的兩個例子:

f1();   //1225,因為函式宣告提升,函式呼叫可在函式宣告之前
function f1(){
    var n=1225;
    console.log(n);
}
f1();   //Uncaught TypeError:f1 is not a function
var f1=function(){
    var n=1225;  
    console.log(n);
}
函式表示式
var f1=function(){
    ... //函式表示式後面加(),當JS引擎解析到此處時才能立即執行該函式
}()

函式宣告
function f1(){
    ...//函式聲明後加括號,js引擎只解析該函式,不會立即呼叫(還是會錯,不要這樣寫)
}()
匿名函式
function(){
     ...//報錯,匿名函式屬於函式表示式,但未賦值,所以JS引擎將function關鍵字當做函式宣告, 
     // 報錯是因為它沒有函式名 
}()
  • 由上可以看出,函式表示式,執行到的時候,可以立即執行;而函式宣告和匿名函式都不可以,無論是function f1(){}() 或者是function(){}()。
  • function(){}()中,當圓括號為了呼叫函數出現在函式後面時,無論在全域性環境或者區域性環境裡遇到了這樣的function關鍵字,預設的,它會將它當作是一個函式宣告,而不是函式表示式,如果你不明確的告訴圓括號它是一個表示式,它會將其當作沒有名字的函式宣告並且丟擲一個錯誤,因為函式宣告需要一個名字。     它們也僅僅是宣告被JS引擎只解析該函式,不會立即呼叫,除非再給一次呼叫,如下:(其實還不太明白

       

(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引擎這是一個函式表示式,不是函式宣告,可以在後面加括號,並立即執行函式的程式碼。

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

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

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

這種( function(){…} )()內部定義的變數不會和外部的變數發生衝突,俗稱“匿名包裹器”或“名稱空間”,有點像閉包,防止作用域汙染,還和呼叫有一定的關係,這是js的基本,都需要花時間深入理解。

匿名包裹器”示例:

參考文章連結:

相關推薦

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

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

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

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

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

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

js 立即執行函式

立即執行函式 目錄 立即執行函式 作用 引數 返回值 立即執行函式 立即執行函式模式是一種語法,可以讓你的函式在定義後立即被執行。 立即執行函式的組成 定義一個函式 將整個函式包裹在一對括號中 將函式宣告轉換為表示式 在結尾加上一對括號 讓函式立即被執

深入理解JS立即執行函式

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

JS-立即執行函式表示式(IIFE)

javascript函式呼叫 在javascript中,每一個函式在被呼叫的時候都會建立一個執行上下文,在該函式內部定義的變數和函式只能在該函式內部被使用,而正是因為這個上下文,使得我們在呼叫函式的時候能建立一些私有變數。 先聲明後呼叫 // 宣告: var foo = function(){

js立即執行函式

 看過jQuery原始碼的人應該知道,jQuery開篇用的就是立即執行函式。立即執行函式常用於第三方庫,好處在於隔離作用域,任何一個第三方庫都會存在大量的變數和函式,為了避免變數汙染(命名衝突),開發者們想到的解決辦法就是使用立即執行函式。 1.什麼是立即執行函式(IIFE

js 立即執行函式表示式 問題

js 語言有許多黑科技。一般像想象中的這樣的程式碼 function(para){ .... }(realPara) 定義函式的同時再進行呼叫,在瀏覽器中會報錯。常見的變為立即執行函式的方法是加’適當的括號‘,如 (function(va

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

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

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

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

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

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

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

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

匿名函數 gpo firebug 發生 報錯 私有 返回 覆蓋 創建 javascript和其他編程語言相比比較隨意,所以javascript代碼中充滿各種奇葩的寫法,有時霧裏看花,當然,能理解各型各色的寫法也是對javascript語言特性更進一步的深入理解。 ( fun

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

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

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

1.函式 定義 1.函式宣告 ```java function test(){ 函式體 }; 2.函式表示式: - 命名函式表示式 - ```java var fn = function test(){}; (匿名)函式表示式 var fn = function(){};

js關於立即執行函式的一點記錄

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

關於JS立即執行函式的一處使用場景

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <style&g