函数的自执行,变量提升和函数提升
其實(shí)之前雖然剛開始學(xué)習(xí)JavaScript的時(shí)候經(jīng)常看到function? add(){}、var add=function(){}、function(){}之類的這種寫法,但是具體是什么叫什么卻沒(méi)有去考慮過(guò)這個(gè)問(wèn)題……
function add(){}這種寫法叫做函數(shù)聲明
var add=function(){}這種寫法叫做函數(shù)表達(dá)式
function(){}這種是匿名函數(shù)
一、函數(shù)的自執(zhí)行
那么有沒(méi)有辦法讓它們不用通過(guò)我們的調(diào)用比如
function add(){}; add();就可以自我執(zhí)行呢?
我們來(lái)試試看這三種方法
//函數(shù)表達(dá)式自執(zhí)行嘗試 var add=function(x,y){console.log(x y); }(5,6); //結(jié)果:11(正確) ) //函數(shù)聲明自執(zhí)行嘗試 function add(x,y){console.log(x y); }(5,6); //結(jié)果:無(wú)法執(zhí)行,也沒(méi)有拋出錯(cuò)誤 //匿名函數(shù)自執(zhí)行嘗試 function(){console.log(arguments[0] arguments[1]); }(5,6); //結(jié)果:這個(gè)的問(wèn)題就大了,拋出語(yǔ)法錯(cuò)誤Uncaught SyntaxError: Unexpected token (函數(shù)表達(dá)式后面加括號(hào)可以立即執(zhí)行函數(shù),然而函數(shù)聲明卻不可以!!
很奇怪地,匿名函數(shù)也是函數(shù)表達(dá)式,但是它為什么會(huì)拋出語(yǔ)法錯(cuò)誤呢?這是因?yàn)槟涿瘮?shù)雖然屬于函數(shù)表達(dá)式,但是很明顯它沒(méi)有賦值操作,JavaScript解析引擎會(huì)把它當(dāng)做函數(shù)聲明,會(huì)跟你要一個(gè)函數(shù)名,但是它是匿名函數(shù),肯定沒(méi)有名字,JavaScript混了,直接給你個(gè)錯(cuò)誤讓你反省一下。
那要怎么解決匿名函數(shù)自執(zhí)行這個(gè)問(wèn)題?其實(shí)很簡(jiǎn)單,只要告訴JavaScript解析器匿名函數(shù)不是函數(shù)聲明就好了。
//加號(hào)function(){console.log(arguments[0] arguments[1]); }(5,6); //減號(hào) -function(){console.log(arguments[0] arguments[1]); }(5,6); //感嘆號(hào) !function(){console.log(arguments[0] arguments[1]); }(5,6); //括號(hào) (function(){console.log(arguments[0] arguments[1]); })(5,6); (function(){console.log(arguments[0] arguments[1]); }(5,6));接下來(lái)就是解決函數(shù)聲明自執(zhí)行的問(wèn)題了,其實(shí)方法跟匿名函數(shù)自執(zhí)行的方法是一樣的,加號(hào),減號(hào),感嘆號(hào),括號(hào),都可以解決
!function add(x,y){console.log(x y); }(5,6); function add(x,y){console.log(x y); }(5,6); -function add(x,y){console.log(x y); }(5,6); (function add(x,y){console.log(x y); })(5,6); (function add(x,y){console.log(x y); }(5,6));二、變量提升、函數(shù)提升
函數(shù)聲明才會(huì)提升,函數(shù)表達(dá)式是屬于變量提升
我們先來(lái)看一下下面這段代碼的結(jié)果是什么
console.log(a); console.log(b); console.log(c); var a=1; function b(){return 2; } var c=function(){return 3; }結(jié)果
console.log(c)的結(jié)果跟console.log(a)是一樣的,說(shuō)明函數(shù)表達(dá)式是屬于變量提升的。這樣證明還是有點(diǎn)草率,我們?cè)賮?lái)看看下面的代碼
console.log(b()); console.log(c()); function b(){return 2; } var c=function(){return 3; }結(jié)果
結(jié)果很明顯了,函數(shù)c只是提升了變量名c而已,函數(shù)聲明才會(huì)提升!
那么變量的提升和函數(shù)聲明的提升哪個(gè)提升的優(yōu)先級(jí)比較高呢?
console.log(b); console.log(b()); var b=1; function b(){return 2; }結(jié)果
結(jié)果顯示函數(shù)聲明提升的優(yōu)先級(jí)比變量提升還要高。
?
更多專業(yè)前端知識(shí),請(qǐng)上 【猿2048】www.mk2048.com
總結(jié)
以上是生活随笔為你收集整理的函数的自执行,变量提升和函数提升的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 微信小程序禁止刷新之后苹果端还可以下拉的
- 下一篇: elementUI之switch应用的坑