js 中的立即執行函式
文章目錄
相信大家經常會遇到下面這兩種寫法:
(function(){ ... })()
和
(function(){ ... }())
關於這樣寫是什麼意思呢?有什麼區別呢?
在此之前,我們需要了解幾個概念:
函式宣告、函式表示式、匿名函式
函式宣告: function fnName() {...}
;
使用 function
關鍵字宣告一個函式,再執行一個函式名,叫函式宣告。
函式表示式: var fnName = function() { ... }
;
使用 function
關鍵字宣告一個函式,但未給函式命名,最後將匿名函式賦予一個變數,叫函式表示式,這是最常見的函式表示式語法形式。
匿名函式: function() { ... }
;
使用 function
關鍵字宣告一個函式,但未給函式命名,所以叫匿名函式,匿名函式屬於函式表示式,匿名函式有很多作用,賦予一個變數則建立函式,賦予一個事件則成為事件處理程式或建立閉包等等。
函式宣告和函式表示式不同之處在於
1、JavaScript 引擎在解析 JavaScript 程式碼時會“函式宣告提升”當前執行環境(作用域)上的函式宣告,而函式表示式必須等到 JavaScript 引擎執行到它所在行時,才會從上而下一行一行地解析函式表示式。
2、函式表示式後面可以加括號立即呼叫該函式,函式宣告不可以,只能以 fnName() 形式呼叫。
知道了這些函式基本概念後,回頭看看 (function(){ ... }())
和 (function() { ... })()
這兩種立即執行函式的寫法,最初我以為是一個括號包裹匿名函式,並在後面加個括號立即呼叫函式,當時不知道為什麼要加括號,後來明白,要在函式體後面加括號就能立即呼叫,則這個函式必須是函式表示式,不能是函式宣告。
(function(a) { console.log(a); //使用()運算子,打印出123 })(123); (function(a) { console.log(a); //使用()運算子,打印出1234 }(1234)); !function(a) { console.log(a); //使用!運算子,打印出12345 }(12345); +function(a) { console.log(a); //使用+運算子,打印出123456 }(123456); -function(a) { console.log(a); //使用-運算子,打印出1234567 }(1234567); var fn = function(a) { console.log(a); //使用=運算子,打印出12345678 }(12345678);
可以看到輸出結果,在 function 前面加 ! 、+ 、- 甚至是逗號等都可以起到函式定以後立即執行的效果,而 () 、! 、+ 、- 、= 等運算子,都將函式宣告轉換成函式表示式,消除了 javascript 引擎識別函式表示式和函式宣告的歧義,告訴 javascript 引擎這是一個函式表示式,不是函式宣告,可以在後面加括號,並立即執行函式的程式碼。
加括號是最安全的做法,因為 ! 、+ 、- 等運算子還會和函式的返回值進行運算,有時造成不必要的麻煩。
不過這樣的寫法有什麼用呢?
javascript 中沒有私有作用域的概念,如果在多人開發的專案上,你在全域性或區域性作用域中聲明瞭一些變數,可能會被其他人不小心用同名的變數給覆蓋掉,根據 javascript 函式作用域鏈的特性,可以使用這種技術可以模仿一個私有作用域,用匿名函式作為一個“容器”,“容器”內部可以訪問外部的變數,而外部環境不能訪問“容器”內部的變數,所以 (function(){ ... })()
內部定義的變數不會和外部的變數發生衝突,俗稱“匿名包裹器”或“名稱空間”。
jQuery 使用的就是這種方法,將 jQuery 程式碼包裹在 (function(window,undefined){ ...jquery程式碼...})(window)
中,在全域性作用域中呼叫 jQuery 程式碼時,可以達到保護 jQuery 內部變數的作用。
---------------------------(正文完)------------------------------------
一個前端的學習交流群,想進來面基的,可以點選這個logo,或者手動search群號:685486827
--------------------------------(完)--------------------------------------
更多學習資源請關注我的新浪微博…
相關推薦
JavaScript中立即執行函式例項詳解 轉載 作者:李牧羊
javascript和其他程式語言相比比較隨意,所以javascript程式碼中充滿各種奇葩的寫法,有時霧裡看花,當然,能理解各型各色的寫法也是對javascript語言特性更進一步的深入理解。這篇文章主要給大家介紹了關於JavaScript中立即執行函式的相關資料,需要的朋友可以參考下。 前言
js關於立即執行函式的一點記錄
( function(){…} )()和( function (){…} () )是兩種javascript立即執行函式的常見寫法,最初我以為是一個括號包裹匿名函式,再在後面加個括號呼叫函式,最後達到函式定義後立即執行的目的,後來發現加括號的原因並非如此。要理解立即執行函
關於JS的立即執行函式的一處使用場景
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <style&g
js中(function(){…})()立即執行函式寫法理解
javascript和其他程式語言相比比較隨意,所以javascript程式碼中充滿各種奇葩的寫法,有時霧裡看花,當然,能理解各型各色的寫法也是對javascript語言特性更進一步的深入理解。 ( function(){…} )()和( function (){…} ()
js 中的立即執行函式
文章目錄 相信大家經常會遇到下面這兩種寫法: (function(){ ... })() 和 (function(){ ... }()) 關於這樣寫是什麼意思呢?有什麼區別呢? 在此之前,我們需要了解幾個概念: 函式宣告、函式表示式、匿名函式 函式宣告:
js中 函式宣告/函式表示式/匿名函式/箭頭函式/立即執行函式
function add(a, b) { // ... } 1.顧名思義,宣告一個函式, 用關鍵字 “function” 來告訴,這是一個函式。 2.任何地方,想用就可以拿過來使用 函式表示式: var add = function (){
javascript中奇怪的執行結果(立即執行函式)
在下面的例子中,將IIFE賦值給一個變數message。message返回另外一個函式,該函式只是簡單地輸出變數x的值。有趣的事情是,當我們把變數x的初始值作為引數傳入函式時,可以在函式執行時所建立的閉包中捕獲變數x的值。無論在外部作用域中x的值發生了什麼變化,閉包將記住函式執行時變數x的值
javascript中的立即執行函式(function(){…})()
javascript和其他程式語言相比比較隨意,所以javascript程式碼中充滿各種奇葩的寫法,有時霧裡看花,當然,能理解各型各色的寫法也是對javascript語言特性更進一步的深入理解。 ( function(){…} )()和( function (){…} () )是兩種javasc
js---作用域鏈,立即執行函式,閉包
1.作用域鏈----函式 定義時會獲得 父級的作用域鏈的值放在自己的 [[Scopes]]屬性中, [[Scopes]]是系統自帶的隱式屬性,通過console.dir(函式名) 可以檢視這個函式的作用域鏈,即 [[Scopes]]。任何函式都至少會
js立即執行函式: (function ( ){})( ) 與 (function ( ){}( )) 有什麼區別?
這篇文章主要介紹了js立即執行函式: (function ( ){})( ) 與 (function ( ){}( )) 有什麼區別,需要的朋友可以參考下 沒有區別。 你需要明白 IIFE 的原理,我簡單說一下: 複製程式碼 程式碼如下: function foo() {...} &
JavaScript中的閉包與立即執行函式
本文是前端學習筆記的第四篇,對應的是渡一教育的web前端開發JavaScript精英課js的第十三到十五課時,感覺難度還可以,閉包其實非常類似Java中的方法內部類,對比一下就很好理解了,主要就是記的知識點多,可能會忘 目錄 閉包 立即執行函式 閉包 &
js函式、作用域、作用域鏈、閉包、立即執行函式
1.函式 定義 1.函式宣告 ```java function test(){ 函式體 }; 2.函式表示式: - 命名函式表示式 - ```java var fn = function test(){}; (匿名)函式表示式 var fn = function(){};
js 立即執行函式
立即執行函式 目錄 立即執行函式 作用 引數 返回值 立即執行函式 立即執行函式模式是一種語法,可以讓你的函式在定義後立即被執行。 立即執行函式的組成 定義一個函式 將整個函式包裹在一對括號中 將函式宣告轉換為表示式 在結尾加上一對括號 讓函式立即被執
深入理解JS立即執行函式
1.什麼是立即執行函式(IIFE) 在瞭解立即執行函式之前先明確一下函式宣告、函式表示式及匿名函式的形式,如下圖: 接下來看立即執行函式的兩種常見形式: ( function(){…} )() 和 ( function (){…} () ) ,一個是一個匿名函式包裹在一個括號運
深入理解javascript中的立即執行函式(function(){…})()
javascript和其他程式語言相比比較隨意,所以javascript程式碼中充滿各種奇葩的寫法,有時霧裡看花,當然,能理解各型各色的寫法也是對javascript語言特性更進一步的深入理解。 ( function(){…} )()和( function (){…}
JS-立即執行函式表示式(IIFE)
javascript函式呼叫 在javascript中,每一個函式在被呼叫的時候都會建立一個執行上下文,在該函式內部定義的變數和函式只能在該函式內部被使用,而正是因為這個上下文,使得我們在呼叫函式的時候能建立一些私有變數。 先聲明後呼叫 // 宣告: var foo = function(){
JS-立即執行函式(function(){...})() && (function(){...})()
在學習閉包的過程中遇到了(立即執行),之前見到(function(){...})() && (function(){...}())這種寫法,就沒有去知其所以然,也不會去寫這種函式。所以一直害怕js,但還是要學習瞭解的,基本概念一定都要知道,才能自己造輪子,而不
js立即執行函式
看過jQuery原始碼的人應該知道,jQuery開篇用的就是立即執行函式。立即執行函式常用於第三方庫,好處在於隔離作用域,任何一個第三方庫都會存在大量的變數和函式,為了避免變數汙染(命名衝突),開發者們想到的解決辦法就是使用立即執行函式。 1.什麼是立即執行函式(IIFE
[轉]深入理解javascript中的立即執行函式(function(){…})()
( function(){…} )()和( function (){…} () )是兩種javascript立即執行函式的常見寫法,最初我以為是一個括號包裹匿名函式,再在後面加個括號呼叫函式,最後達到函式定義後立即執行的目的,後來發現加括號的原因並非如此。要理解
js立即執行函式(function ( ){})( ) 與 (function ( ){}( )) 區別
結論:沒有區別。 下面說下立即執行函式表示式(IIFE)的原理: function foo(){...} //這是函式定義,直譯器遇到它的時候,不會執行; foo(); //這是語句,直譯器遇到語句會執行它。這種寫法是傳統寫法,定義和執行分開,也很好理解。那為什麼還要有