摘要:構(gòu)造函數(shù)調(diào)用會(huì)使用新創(chuàng)建的對(duì)象作為調(diào)用上下文。函數(shù)的參數(shù)相關(guān)可選形參當(dāng)傳入的實(shí)參比函數(shù)聲明時(shí)指定的形參數(shù)量要少,剩下的形參都將設(shè)置為值實(shí)參多則會(huì)自動(dòng)省略。它們的第一個(gè)實(shí)參是要調(diào)用函數(shù)的母對(duì)象,它是調(diào)用上下文,函數(shù)體內(nèi)通過(guò)引用它。
寫在前面
注:這個(gè)系列是本人對(duì)js知識(shí)的一些梳理,其中不少內(nèi)容來(lái)自書籍:Javascript高級(jí)程序設(shè)計(jì)第三版和JavaScript權(quán)威指南第六版,感謝它們的作者和譯者。有發(fā)現(xiàn)什么問(wèn)題的,歡迎留言指出。
1.函數(shù)聲明和函數(shù)表達(dá)式函數(shù)聲明具有聲明提前/聲明提升的特性,這一點(diǎn)和變量的聲明特性相似,執(zhí)行代碼之前會(huì)先讀取函數(shù)聲明和變量聲明,意味著可以把函數(shù)聲明放在調(diào)用它的語(yǔ)句后面,但變量聲明肯定最好不要這樣,因?yàn)槌0殡Sundefined問(wèn)題。
函數(shù)聲明的函數(shù)名稱和函數(shù)體都提前,而函數(shù)表達(dá)式只是變量聲明提前(而變量的初始化代碼仍然在原來(lái)的位置)。
2.函數(shù)調(diào)用構(gòu)成函數(shù)主體的代碼定義時(shí)并不會(huì)執(zhí)行,調(diào)用函數(shù)時(shí)才會(huì)執(zhí)行,有4中方式調(diào)用函數(shù):
作為函數(shù)
作為方法
作為構(gòu)造函數(shù)
通過(guò)call()和apply()方法間接調(diào)用
①作為函數(shù)調(diào)用的注意點(diǎn),嚴(yán)格模式下調(diào)用上下文是undefined,所以通常不使用this關(guān)鍵字,②作為方法調(diào)用的話調(diào)用上下文就是方法所在的對(duì)象,this關(guān)鍵字引用著該對(duì)象。③而嵌套函數(shù)不會(huì)從調(diào)用它的函數(shù)中繼承this,如果想訪問(wèn)外部的this,可以用變量保存this的值。④構(gòu)造函數(shù)調(diào)用會(huì)使用新創(chuàng)建的對(duì)象作為調(diào)用上下文。
3.函數(shù)的參數(shù)相關(guān)可選形參
當(dāng)傳入的實(shí)參比函數(shù)聲明時(shí)指定的形參數(shù)量要少,剩下的形參都將設(shè)置為undefined值(實(shí)參多則會(huì)自動(dòng)省略)。所以在合適的場(chǎng)景就可以選擇使用可選形參:
function getPropertyNames(o, /* optional */ a) { if(a=== undefined) a=[]; for(var prop in o) a.push(prop); return a; } var arr = [1,2]; //[1, 2, "x", "y"] console.log(getPropertyNames({x:1,y:2},arr)); //["x", "y"] console.log(getPropertyNames({x:1,y:2}));
注意點(diǎn):需要將可選形參放在形參列表的最后,并在函數(shù)定義是使用注釋強(qiáng)調(diào)形參是可選的。
實(shí)參對(duì)象arguments
在函數(shù)體內(nèi),標(biāo)識(shí)符arguments是指向?qū)崊?duì)象的引用,它是一個(gè)類數(shù)組對(duì)象,可以通過(guò)數(shù)字下標(biāo)訪問(wèn)傳入的實(shí)參值,這樣函數(shù)就可以操作任意數(shù)量的實(shí)參:
function getMaxValue(/* ... */) { var max = arguments[0]; for(var i=0,len=arguments.length;imax){ max = arguments[i]; } } return max; } console.log(getMaxValue(4,2,1,8,10));//10
將對(duì)象屬性用作實(shí)參:當(dāng)一個(gè)函數(shù)的形參過(guò)多(比如超過(guò)3個(gè)),調(diào)用時(shí)記住實(shí)參的正確順序不容易。這時(shí)可以把形參寫成一個(gè)對(duì)象,就沒(méi)有參數(shù)順序的影響了,而且還可以在取值的時(shí)候使用||符號(hào)設(shè)置默認(rèn)值。當(dāng)然,形參不多就不需這樣做,效率會(huì)低一些。
在每個(gè)形參左邊使用類似/*array*/的類型注釋。在函數(shù)體內(nèi)應(yīng)該要有實(shí)參類型檢查的邏輯,在傳入非法值時(shí)報(bào)錯(cuò)。
自定義函數(shù)屬性:函數(shù)是一種特殊的對(duì)象,所以在適當(dāng)?shù)臅r(shí)候可以給函數(shù)定義屬性,比如函數(shù)需要一個(gè)“靜態(tài)變量”:
//階乘 function factorial(n) { if(isFinite(n) && n>0 && n==Math.round(n)){ if(!(n in factorial)) factorial[n] = n * factorial(n-1); return factorial[n]; } else return NaN; } factorial[1] = 1; console.log(factorial([5]));//1204.作為命名空間的函數(shù)
為了不污染全局空間,常用定義匿名函數(shù)并立即在單個(gè)表達(dá)式中調(diào)用的方式:
var extendFun = (function () { //函數(shù)體 }());5.call()、apply()和bind()
call()和apply()
call()和apply()是函數(shù)的方法,通過(guò)調(diào)用方法的形式來(lái)簡(jiǎn)介調(diào)用函數(shù),我們之前介紹繼承的時(shí)候,有一個(gè)地方是借用超類型的構(gòu)造函數(shù),就是使用了call。它們的第一個(gè)實(shí)參是要調(diào)用函數(shù)的母對(duì)象,它是調(diào)用上下文,函數(shù)體內(nèi)通過(guò)this引用它。
call除了第一個(gè)參數(shù)之后的參數(shù)就是要傳給函數(shù)的值:
function logMsg(x,y,z) { console.log(x+"/"+y+"/"+z); } //打印2/4/6 logMsg.call({},2,4,6);
而apply除了第一個(gè)參數(shù)以外,提供一個(gè)數(shù)組用于傳給函數(shù):
function logMsg(x,y,z) { console.log(x+"/"+y+"/"+z); } //打印8/10/12 logMsg.apply({},[8,10,12]);
apply的數(shù)組參數(shù)可以是真實(shí)數(shù)組,也可以是類數(shù)組對(duì)象,比如可以把當(dāng)前函數(shù)的arguments數(shù)組直接傳入:
function logMsg(x,y,z) { console.log(x+"/"+y+"/"+z); } function wantToLog(a,b,c) { logMsg.apply({},arguments); } //打印1/2/3/4 wantToLog(1,2,3);
bind()
這個(gè)方法主要作用是將函數(shù)綁定至某個(gè)對(duì)象,除了第一個(gè)實(shí)參以外,其他的實(shí)參會(huì)傳入到函數(shù)里面:
function f(y,z) { console.log("y:"+y);//y:4 console.log("z:"+z);//z:2 return this.x + y + z; } var g = f.bind({x:3},4); console.log(g(2));//3+4+2=9 //這里面綁定了this和y
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/108389.html
摘要:在此例中,在匿名函數(shù)被返回后,它的作用域鏈初始化為包含函數(shù)的活動(dòng)對(duì)象和全局變量對(duì)象。函數(shù)在執(zhí)行完畢后,其活動(dòng)對(duì)象也不會(huì)被銷毀,因?yàn)槟涿瘮?shù)的作用域鏈仍然在引用這個(gè)活動(dòng)對(duì)象,結(jié)果就是只是的執(zhí)行環(huán)境的作用域鏈會(huì)被銷毀,其活動(dòng)對(duì)象會(huì)留在內(nèi)存中。 寫在前面 注:這個(gè)系列是本人對(duì)js知識(shí)的一些梳理,其中不少內(nèi)容來(lái)自書籍:Javascript高級(jí)程序設(shè)計(jì)第三版和JavaScript權(quán)威指南第六版,...
摘要:寫在前面正在看的源碼看到了部分感覺(jué)以前看的正則表達(dá)式基礎(chǔ)知識(shí)已經(jīng)完全不夠用了現(xiàn)翻閱博客資料將一些中正則表達(dá)式難用的部分總結(jié)歸納方便自己和友翻閱正則分組重復(fù)匹配對(duì)于重復(fù)的匹配我們經(jīng)常使用到正則表達(dá)式的分組功能我們使用正則匹配地址來(lái)實(shí)踐一下假 [TOC] 寫在前面 - Lionad 正在看VueJS的源碼, 看到了HtmlParser部分, 感覺(jué)以前看的正則表達(dá)式基礎(chǔ)知識(shí)已經(jīng)完全不夠用了,...
摘要:返回后,代表操作已完成,記錄結(jié)束時(shí)間并輸出。從零組裝因?yàn)閷?duì)的學(xué)習(xí)和使用,知道了自己對(duì)于后臺(tái)框架的真實(shí)需求。所以這回決定不用之內(nèi)的工具,而是自己從零開始,組裝一個(gè)適合自己的框架。就是去和上,尋找一個(gè)一個(gè)的包并組裝在一起了而已。 起因 作為一個(gè)前端,Node.js算是必備知識(shí)之一。同時(shí)因?yàn)樽约盒枰鲆恍┖笈_(tái)性的工作,或者完成一個(gè)小型應(yīng)用。所以學(xué)習(xí)了Node的Express框架,用于輔助和加...
摘要:好程序員前端培訓(xùn)入門之基礎(chǔ)知識(shí)梳理匯總,前端工程師是當(dāng)前各大企業(yè)都比較稀缺的人才,薪資待遇和就業(yè)前景都很不錯(cuò)。作用域鏈的前端,始終是當(dāng)前執(zhí)行代碼所在環(huán)境的變量對(duì)象。 好程序員Web前端培訓(xùn)入門之JS基礎(chǔ)知識(shí)梳理匯總,Web前端工程師是當(dāng)前各大企業(yè)都比較稀缺的人才,薪資待遇和就業(yè)前景都很不錯(cuò)。不論是專業(yè)還是非專業(yè),有基礎(chǔ)亦或是無(wú)基礎(chǔ),都想通過(guò)學(xué)習(xí)Web前端實(shí)現(xiàn)高薪就業(yè)。不過(guò),學(xué)習(xí)要一...
摘要:好程序員前端培訓(xùn)入門之基礎(chǔ)知識(shí)梳理匯總,前端工程師是當(dāng)前各大企業(yè)都比較稀缺的人才,薪資待遇和就業(yè)前景都很不錯(cuò)。作用域鏈的前端,始終是當(dāng)前執(zhí)行代碼所在環(huán)境的變量對(duì)象。 好程序員Web前端培訓(xùn)入門之JS基礎(chǔ)知識(shí)梳理匯總,Web前端工程師是當(dāng)前各大企業(yè)都比較稀缺的人才,薪資待遇和就業(yè)前景都很不錯(cuò)。不論是專業(yè)還是非專業(yè),有基礎(chǔ)亦或是無(wú)基礎(chǔ),都想通過(guò)學(xué)習(xí)Web前端實(shí)現(xiàn)高薪就業(yè)。不過(guò),學(xué)習(xí)要一...
閱讀 5295·2021-10-13 09:39
閱讀 2044·2019-08-29 11:12
閱讀 1211·2019-08-28 18:16
閱讀 1933·2019-08-26 12:16
閱讀 1317·2019-08-26 12:13
閱讀 3056·2019-08-26 10:59
閱讀 2398·2019-08-23 18:27
閱讀 3065·2019-08-23 18:02