1. 程式人生 > >js 中的立即執行函式

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 內部變數的作用。

---------------------------(正文完)------------------------------------
一個前端的學習交流群,想進來面基的,可以點選這個logoVue學習交流,或者手動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(); //這是語句,直譯器遇到語句會執行它。這種寫法是傳統寫法,定義和執行分開,也很好理解。那為什麼還要有