javascript
JS进阶之---函数,立即执行函数
?
一、函數(shù)
函數(shù)聲明、函數(shù)表達(dá)式、匿名函數(shù)
函數(shù)聲明:使用function關(guān)鍵字聲明一個函數(shù),再指定一個函數(shù)名,叫函數(shù)聲明。function name () { … }
函數(shù)表達(dá)式:使用function關(guān)鍵字聲明一個函數(shù),但未給函數(shù)命名,最后將匿名函數(shù)賦予一個變量,叫函數(shù)表達(dá)式。var name = function(){ ... }
匿名函數(shù):使用function關(guān)鍵字聲明一個函數(shù),但未給函數(shù)命名,所以叫匿名函數(shù)。function () { ... }
?
調(diào)用時的區(qū)別
name(); //正常,因為‘提升'了函數(shù)聲明,函數(shù)調(diào)用可在函數(shù)聲明之前 function name(){ ... }name(); //報錯,變量name還未保存對函數(shù)的引用,函數(shù)調(diào)用必須在函數(shù)表達(dá)式之后 var name=function(){ ... }?
函數(shù)參數(shù)傳遞方式:按值傳遞
我們知道,函數(shù)的參數(shù)在進(jìn)入函數(shù)后,實際是被保存在了函數(shù)的變量對象中,因此,這個時候相當(dāng)于發(fā)生了一次復(fù)制。
var a = 20; function fn(a) {a = a + 10;return a; } fn(a); console.log(a); // 20var a = { m: 10, n: 20 } function fn(a) {a.m = 20;return a; } fn(a); console.log(a); // { m: 20, n: 20 }函數(shù)參數(shù)傳遞方式是按值傳遞,只不過當(dāng)我們期望傳遞一個引用類型時,真正傳遞的,只是這個引用類型保存在變量對象中的引用而已。
?
?
二、立即執(zhí)行函數(shù)
兩種javascript立即執(zhí)行函數(shù)的常見寫法。
(function(){… })() //(...)()形式(function(){… }()) //(...())形式?
在函數(shù)的后面加上括號,就能變成立即執(zhí)行函數(shù)嗎?
1.函數(shù)表達(dá)式后面加括號
var name=function(){alert('Hello World'); }(); //函數(shù)表達(dá)式。后面加括號,當(dāng)javascript引擎解析到此處時能立即調(diào)用函數(shù)?
2.匿名函數(shù)后面加括號
function(){console.log('Hello World'); }(); //匿名函數(shù)方式。后面加括號,報語法錯誤。雖然匿名函數(shù)屬于函數(shù)表達(dá)式,但是未進(jìn)行賦值操作,所以javascript引擎將開頭的function關(guān)鍵字當(dāng)做函數(shù)聲明,報錯:要求需要一個函數(shù)名。?
3.函數(shù)聲明方式后面加括號
function name(){alert('Hello World'); }(); //函數(shù)聲明方式,此時相當(dāng)于對匿名函數(shù)加了名字。后面加括號,還是報錯,Uncaught SyntaxError: Unexpected token )。在一個表達(dá)式后面加上括號(),該表達(dá)式會立即執(zhí)行,但是在一個語句后面加上括號(),它的意思只是分組操作符。? function name(){
?alert('Hello World');
? }(1); //如果在括弧()里傳入一個表達(dá)式,將不會有異常拋出.但是函數(shù)依然不會執(zhí)行。因為它完全等價于,在一個function聲明后面,又聲明了一個毫無關(guān)系的表達(dá)式
?
回頭看看( function(){…} )()和( function (){…} () ),要在函數(shù)體后面加括號就能立即調(diào)用,則這個函數(shù)必須是函數(shù)表達(dá)式,不能是函數(shù)聲明。
所以只需要用大括弧將代碼括住就行了,因為JavaScript里括弧()里面不能包含語句,所以在這一點上,解析器在解析function關(guān)鍵字的時候,會將相應(yīng)的代碼解析成function表達(dá)式,而不是function聲明。
?
(function(a){console.log(a); //123 })(123); //后面括號里傳入了函數(shù)執(zhí)行的參數(shù)。如果這個參數(shù)是外部的變量,將會形成閉包。這個變量也會保存在這個函數(shù)中。?
?
三、模塊
提到立即執(zhí)行函數(shù),總會想到模塊,因為模塊通常用立即執(zhí)行函數(shù)的方式去創(chuàng)建。
一個模塊可以包括:私有變量、私有方法、公有變量、公有方法。
(function() {// 私有變量var age = 20;var name = 'Tom';// 私有方法function getName() {return `your name is ` + name;}// 公有方法function getAge() {return age;}// 將公有方法引用保存在外部執(zhí)行環(huán)境的變量中,形成閉包,防止該執(zhí)行環(huán)境被垃圾回收window.getAge = getAge; })();?
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/lishuxue/p/6588234.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的JS进阶之---函数,立即执行函数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 梦到死去的外婆复活了有什么兆头
- 下一篇: JS入门熟知