javascript
JavaScript 自执行函数剖析
回想一下,我們平時寫的一些具名函數(也就是區別于匿名函數的函數),如下面一個例子:?
1 function sayHello(){ 2 console.log("hello,我是林麗君"); 3 } 4 sayHello();??
分析一下上面的調用方式,sayHello是我們的函數名,當我們想要它執行的時候,我們就在這個函數名的后面添加一對括號(),像這樣sayHello(),我們的函數就會被執行了。還不懂?沒關系,我們再來分析一個例子:?
1 var sayHello=function(){ 2 console.log("hello,我是林麗君"); 3 } 4 sayHello();//hello,我是林麗君?
在上面的例子中,我們定義了一個匿名函數,這個匿名函數干的事就是在控制臺輸出“hello,我是林麗君”,然后把這個匿名函數賦給變量sayHello,那么我們調用的時候就是在這個變量名的后面直接加上一對括號(),這樣我們的函數就會被執行,在上面的例子中,如果我們不加后面那對括號,我們調用這個sayHello會輸出什么呢?我們來用代碼測試一下:?
1 function sayHello(){ 2 console.log("hello,我是林麗君"); 3 } 4 console.log(sayHello);?
在控制臺我們會看到:
?
它會輸出整個函數的定義,所以我們在這個函數的后面加上一個(),其實是在調用這個函數,所以自執行函數的另外一種更明確的叫法應該是“立即調用的函數表達式”,它并不是自己能夠自動執行,而是我們使用者自己在顯式的調用它。注意在這里我們要提醒各位讀者,你可不能貪圖方便將我們的代碼寫成這樣:
1 function(){ 2 console.log("hello,我是林麗君"); 3 }();這段代碼會導致語法錯誤,因為JavaScript將function關鍵字當做一個函數聲明的開始,而函數聲明的后面不能跟圓括號,但是函數表達式的后面可以跟圓括號,想要將我們的函數聲明轉變成函數表達式,我們只需要將我們的函數聲明加上一對圓括號,像這樣:
1 (function(){ 2 console.log("hello,我是林麗君"); 3 })();?
如果我們的函數是需要傳參的話,像下面這樣,我們直接在后面的圓括號里面把我們的參數傳進去就可以了
1 (function sayLove(i,you){ 2 console.log(i+" love "+you); 3 })("林麗君","張俊祺"); 4 //這個時候會輸出 林麗君 love 張俊祺??
看到這里你一定很疑惑我們為什么要這樣寫,你經常看到別人說這樣寫是為了創建作用域,或許你只是人云亦云,并不是真的理解這個話的意思,下面我們來分析它的作用:
在JavaScript里面,我們并沒有塊級作用域的概念,這個話怎么理解呢?下面來看一段代碼:
1 function countNum(num){ 2 for(var i=0;i<num;i++){ 3 } 4 //這里我們調用一下i 5 console.log(i); 6 //這個時候我們控制臺會輸出i,一開始變量i的值是0,在java和C++等語言中,變量i在循環之后會被銷毀,但是在JavaScript里面,這個i可以在函數的內部的任何地方被調用 7 }如果你在函數里面重復聲明了這個i,JavaScript是不是提示你重復定義了這個i,在java語言中,會直接報錯,因為一個變量不能再一個函數中被重復定義多次,所以匿名函數可以用來模仿塊級作用域來避免這些問題,像這樣:
function countNum(num){(for(var i=0;i<num;i++){})(); console.log(i); //這里我們再調用一下i,這個時候會報錯 }所以這種技術通常用在全局作用域中被用在函數的外部,從而限制向全局作用域添加過多的變量和函數,同時可以避免命名沖突
這種技術我們比較關注的的點就是我們的this對象,首先我們必須明白這一點,我們的this是基于函數的執行環境的,在全局函數中,我們的this是window對象,當函數被當做某個對象的方法調用的時候,this是指向那個對象,不過,匿名函數的執行環境具有全局性,因此其this對象通常指向window,當然根據我們編寫閉包的方式,這個分界線并不總是那么清楚。
?
轉載于:https://www.cnblogs.com/baby-lijun/p/5321443.html
總結
以上是生活随笔為你收集整理的JavaScript 自执行函数剖析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 从 github 执行 git clon
- 下一篇: gradle idea java ssm