国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

js知識梳理5:關于函數的要點梳理(1)

付倫 / 1862人閱讀

摘要:構造函數調用會使用新創建的對象作為調用上下文。函數的參數相關可選形參當傳入的實參比函數聲明時指定的形參數量要少,剩下的形參都將設置為值實參多則會自動省略。它們的第一個實參是要調用函數的母對象,它是調用上下文,函數體內通過引用它。

寫在前面

注:這個系列是本人對js知識的一些梳理,其中不少內容來自書籍:Javascript高級程序設計第三版和JavaScript權威指南第六版,感謝它們的作者和譯者。有發現什么問題的,歡迎留言指出。

1.函數聲明和函數表達式

函數聲明具有聲明提前/聲明提升的特性,這一點和變量的聲明特性相似,執行代碼之前會先讀取函數聲明和變量聲明,意味著可以把函數聲明放在調用它的語句后面,但變量聲明肯定最好不要這樣,因為常伴隨undefined問題。

函數聲明的函數名稱和函數體都提前,而函數表達式只是變量聲明提前(而變量的初始化代碼仍然在原來的位置)。

2.函數調用

構成函數主體的代碼定義時并不會執行,調用函數時才會執行,有4中方式調用函數:

作為函數

作為方法

作為構造函數

通過call()和apply()方法間接調用

①作為函數調用的注意點,嚴格模式下調用上下文是undefined,所以通常不使用this關鍵字,②作為方法調用的話調用上下文就是方法所在的對象,this關鍵字引用著該對象。③而嵌套函數不會從調用它的函數中繼承this,如果想訪問外部的this,可以用變量保存this的值。④構造函數調用會使用新創建的對象作為調用上下文。

3.函數的參數相關

可選形參

當傳入的實參比函數聲明時指定的形參數量要少,剩下的形參都將設置為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}));

注意點:需要將可選形參放在形參列表的最后,并在函數定義是使用注釋強調形參是可選的。

實參對象arguments

在函數體內,標識符arguments是指向實參對象的引用,它是一個類數組對象,可以通過數字下標訪問傳入的實參值,這樣函數就可以操作任意數量的實參:

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

將對象屬性用作實參:當一個函數的形參過多(比如超過3個),調用時記住實參的正確順序不容易。這時可以把形參寫成一個對象,就沒有參數順序的影響了,而且還可以在取值的時候使用||符號設置默認值。當然,形參不多就不需這樣做,效率會低一些。

在每個形參左邊使用類似/*array*/的類型注釋。在函數體內應該要有實參類型檢查的邏輯,在傳入非法值時報錯。

自定義函數屬性:函數是一種特殊的對象,所以在適當的時候可以給函數定義屬性,比如函數需要一個“靜態變量”:

//階乘
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]));//120
4.作為命名空間的函數

為了不污染全局空間,常用定義匿名函數并立即在單個表達式中調用的方式:

var extendFun = (function () {
    //函數體
}());
5.call()、apply()和bind()

call()和apply()

call()和apply()是函數的方法,通過調用方法的形式來簡介調用函數,我們之前介紹繼承的時候,有一個地方是借用超類型的構造函數,就是使用了call。它們的第一個實參是要調用函數的母對象,它是調用上下文,函數體內通過this引用它。

call除了第一個參數之后的參數就是要傳給函數的值:

function logMsg(x,y,z) {
    console.log(x+"/"+y+"/"+z);
}
//打印2/4/6
logMsg.call({},2,4,6);

而apply除了第一個參數以外,提供一個數組用于傳給函數:

function logMsg(x,y,z) {
    console.log(x+"/"+y+"/"+z);
}
//打印8/10/12
logMsg.apply({},[8,10,12]);

apply的數組參數可以是真實數組,也可以是類數組對象,比如可以把當前函數的arguments數組直接傳入:

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()

這個方法主要作用是將函數綁定至某個對象,除了第一個實參以外,其他的實參會傳入到函數里面:

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

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/108389.html

相關文章

  • js知識梳理6:關于函數要點梳理(2)(作用域鏈和閉包)

    摘要:在此例中,在匿名函數被返回后,它的作用域鏈初始化為包含函數的活動對象和全局變量對象。函數在執行完畢后,其活動對象也不會被銷毀,因為匿名函數的作用域鏈仍然在引用這個活動對象,結果就是只是的執行環境的作用域鏈會被銷毀,其活動對象會留在內存中。 寫在前面 注:這個系列是本人對js知識的一些梳理,其中不少內容來自書籍:Javascript高級程序設計第三版和JavaScript權威指南第六版,...

    aristark 評論0 收藏0
  • 『不再迷茫 - 正則表達式』JS正則要點梳理 持續更新

    摘要:寫在前面正在看的源碼看到了部分感覺以前看的正則表達式基礎知識已經完全不夠用了現翻閱博客資料將一些中正則表達式難用的部分總結歸納方便自己和友翻閱正則分組重復匹配對于重復的匹配我們經常使用到正則表達式的分組功能我們使用正則匹配地址來實踐一下假 [TOC] 寫在前面 - Lionad 正在看VueJS的源碼, 看到了HtmlParser部分, 感覺以前看的正則表達式基礎知識已經完全不夠用了,...

    SQC 評論0 收藏0
  • 從零組裝新工具 - Koa2

    摘要:返回后,代表操作已完成,記錄結束時間并輸出。從零組裝因為對的學習和使用,知道了自己對于后臺框架的真實需求。所以這回決定不用之內的工具,而是自己從零開始,組裝一個適合自己的框架。就是去和上,尋找一個一個的包并組裝在一起了而已。 起因 作為一個前端,Node.js算是必備知識之一。同時因為自己需要做一些后臺性的工作,或者完成一個小型應用。所以學習了Node的Express框架,用于輔助和加...

    sutaking 評論0 收藏0
  • 好程序員Web前端培訓入門之JS基礎知識梳理匯總

    摘要:好程序員前端培訓入門之基礎知識梳理匯總,前端工程師是當前各大企業都比較稀缺的人才,薪資待遇和就業前景都很不錯。作用域鏈的前端,始終是當前執行代碼所在環境的變量對象。   好程序員Web前端培訓入門之JS基礎知識梳理匯總,Web前端工程師是當前各大企業都比較稀缺的人才,薪資待遇和就業前景都很不錯。不論是專業還是非專業,有基礎亦或是無基礎,都想通過學習Web前端實現高薪就業。不過,學習要一...

    int64 評論0 收藏0

發表評論

0條評論

付倫

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<