日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

JavaScript 自执行函数剖析

發(fā)布時(shí)間:2024/4/14 javascript 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JavaScript 自执行函数剖析 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

回想一下,我們平時(shí)寫的一些具名函數(shù)(也就是區(qū)別于匿名函數(shù)的函數(shù)),如下面一個(gè)例子:?

1 function sayHello(){ 2 console.log("hello,我是林麗君"); 3 } 4 sayHello();

??

分析一下上面的調(diào)用方式,sayHello是我們的函數(shù)名,當(dāng)我們想要它執(zhí)行的時(shí)候,我們就在這個(gè)函數(shù)名的后面添加一對(duì)括號(hào)(),像這樣sayHello(),我們的函數(shù)就會(huì)被執(zhí)行了。還不懂?沒關(guān)系,我們?cè)賮矸治鲆粋€(gè)例子:?

1 var sayHello=function(){ 2 console.log("hello,我是林麗君"); 3 } 4 sayHello();//hello,我是林麗君

?

在上面的例子中,我們定義了一個(gè)匿名函數(shù),這個(gè)匿名函數(shù)干的事就是在控制臺(tái)輸出“hello,我是林麗君”,然后把這個(gè)匿名函數(shù)賦給變量sayHello,那么我們調(diào)用的時(shí)候就是在這個(gè)變量名的后面直接加上一對(duì)括號(hào)(),這樣我們的函數(shù)就會(huì)被執(zhí)行,在上面的例子中,如果我們不加后面那對(duì)括號(hào),我們調(diào)用這個(gè)sayHello會(huì)輸出什么呢?我們來用代碼測(cè)試一下:?

1 function sayHello(){ 2 console.log("hello,我是林麗君"); 3 } 4 console.log(sayHello);

?

在控制臺(tái)我們會(huì)看到:

?

它會(huì)輸出整個(gè)函數(shù)的定義,所以我們?cè)谶@個(gè)函數(shù)的后面加上一個(gè)(),其實(shí)是在調(diào)用這個(gè)函數(shù),所以自執(zhí)行函數(shù)的另外一種更明確的叫法應(yīng)該是“立即調(diào)用的函數(shù)表達(dá)式”,它并不是自己能夠自動(dòng)執(zhí)行,而是我們使用者自己在顯式的調(diào)用它。注意在這里我們要提醒各位讀者,你可不能貪圖方便將我們的代碼寫成這樣:

1 function(){ 2 console.log("hello,我是林麗君"); 3 }();

這段代碼會(huì)導(dǎo)致語法錯(cuò)誤,因?yàn)镴avaScript將function關(guān)鍵字當(dāng)做一個(gè)函數(shù)聲明的開始,而函數(shù)聲明的后面不能跟圓括號(hào),但是函數(shù)表達(dá)式的后面可以跟圓括號(hào),想要將我們的函數(shù)聲明轉(zhuǎn)變成函數(shù)表達(dá)式,我們只需要將我們的函數(shù)聲明加上一對(duì)圓括號(hào),像這樣:

1 (function(){ 2 console.log("hello,我是林麗君"); 3 })();

?

如果我們的函數(shù)是需要傳參的話,像下面這樣,我們直接在后面的圓括號(hào)里面把我們的參數(shù)傳進(jìn)去就可以了

1 (function sayLove(i,you){ 2 console.log(i+" love "+you); 3 })("林麗君","張俊祺"); 4 //這個(gè)時(shí)候會(huì)輸出 林麗君 love 張俊祺

??

看到這里你一定很疑惑我們?yōu)槭裁匆@樣寫,你經(jīng)常看到別人說這樣寫是為了創(chuàng)建作用域,或許你只是人云亦云,并不是真的理解這個(gè)話的意思,下面我們來分析它的作用:

在JavaScript里面,我們并沒有塊級(jí)作用域的概念,這個(gè)話怎么理解呢?下面來看一段代碼:

1 function countNum(num){ 2 for(var i=0;i<num;i++){ 3 } 4 //這里我們調(diào)用一下i 5 console.log(i); 6 //這個(gè)時(shí)候我們控制臺(tái)會(huì)輸出i,一開始變量i的值是0,在java和C++等語言中,變量i在循環(huán)之后會(huì)被銷毀,但是在JavaScript里面,這個(gè)i可以在函數(shù)的內(nèi)部的任何地方被調(diào)用 7 }

如果你在函數(shù)里面重復(fù)聲明了這個(gè)i,JavaScript是不是提示你重復(fù)定義了這個(gè)i,在java語言中,會(huì)直接報(bào)錯(cuò),因?yàn)橐粋€(gè)變量不能再一個(gè)函數(shù)中被重復(fù)定義多次,所以匿名函數(shù)可以用來模仿塊級(jí)作用域來避免這些問題,像這樣:

function countNum(num){(for(var i=0;i<num;i++){})(); console.log(i); //這里我們?cè)僬{(diào)用一下i,這個(gè)時(shí)候會(huì)報(bào)錯(cuò) }

所以這種技術(shù)通常用在全局作用域中被用在函數(shù)的外部,從而限制向全局作用域添加過多的變量和函數(shù),同時(shí)可以避免命名沖突

這種技術(shù)我們比較關(guān)注的的點(diǎn)就是我們的this對(duì)象,首先我們必須明白這一點(diǎn),我們的this是基于函數(shù)的執(zhí)行環(huán)境的,在全局函數(shù)中,我們的this是window對(duì)象,當(dāng)函數(shù)被當(dāng)做某個(gè)對(duì)象的方法調(diào)用的時(shí)候,this是指向那個(gè)對(duì)象,不過,匿名函數(shù)的執(zhí)行環(huán)境具有全局性,因此其this對(duì)象通常指向window,當(dāng)然根據(jù)我們編寫閉包的方式,這個(gè)分界線并不總是那么清楚。

?

轉(zhuǎn)載于:https://www.cnblogs.com/baby-lijun/p/5321443.html

總結(jié)

以上是生活随笔為你收集整理的JavaScript 自执行函数剖析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。