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