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