摘要:這么長時間沒有寫博客,就是因為函數(shù)這部分比較麻煩,自己一直想抽出大把的時間來研究這個,可是結(jié)果卻是一拖再拖,這樣不好。
這么長時間沒有寫博客,就是因為函數(shù)這部分比較麻煩,自己一直想抽出大把的時間來研究這個,可是結(jié)果卻是一拖再拖,這樣不好。有時間就寫才是王道啊,不然這計劃得一直卡在這里了..
1. 幾個概念函數(shù):將代碼進行封裝, 復用的邏輯單元(代碼)
對象:無序鍵值對的集合
數(shù)組:有序鍵值對的集合, 數(shù)組的索引號就是鍵
屬性:對象屬性的值是一個普通的數(shù)據(jù)
方法:對象的屬性是一個函數(shù)
對象的成員:包括屬性和方法
另外關(guān)于函數(shù),你應該時刻記住的是:函數(shù)也是對象,函數(shù)名是一個指向函數(shù)對象的指針。因此,函數(shù)也可以作為參數(shù)傳遞
2. 函數(shù)的三種創(chuàng)建方式 2.1 函數(shù)表達式標準語法:
var fn = function(){}; // 只能在聲明之后調(diào)用
有一種寫法也需要注意,可能在面試題中會遇到:
var fn = function fn1(){}; // 不會報錯
有這樣一個例子,能夠很好的區(qū)分兩種寫法的差異
// 標準寫法 var fn = function(){ console.log(fn); // function (){ console.log(fn) } }; fn(); console.log(fn); // function (){ console.log(fn) } // 非主流寫法 var fn1 = function fn2() { console.log(fn1); console.log(fn2); } fn1(); console.log(fn1); console.log(fn2);
為了更有說服力,我直接上圖吧!
結(jié)論:
函數(shù)表達式聲明方式中,function后面也可以添加函數(shù)名,但僅能在函數(shù)內(nèi)部使用
語法:
function fn(){}; // 能夠在作用域下的任何地方使用2.3 構(gòu)造函數(shù)聲明
語法:
var fn = new Function(param1, param2, body)
Function構(gòu)造函數(shù)可以接受任意數(shù)量的參數(shù),但最后一個參數(shù)始終被看做函數(shù)體,相當于一個小型的js編譯器(執(zhí)行效率低)
var fn = new Function(num1, num2, “return num1+num2”); // 等價于 function fn(num1, num2) { return num1 + num2; } // 或 var fn = function(num1, num2) { return num1 + num2; }2.3 函數(shù)聲明和函數(shù)表達式的區(qū)別
1 函數(shù)聲明會把整個函數(shù)體提升到最前面function fn() {},因此調(diào)用的位置沒有先后之分;函數(shù)表達式只會把函數(shù)名字提升var fn = function() {}; 此時函數(shù)作為數(shù)據(jù),因此必須先聲明后使用
2 函數(shù)聲明不能夠出現(xiàn)在其他語句塊中!函數(shù)聲明能夠出現(xiàn)的位置: 全局環(huán)境中其他函數(shù)內(nèi)部
個人建議:從代碼可維護性出發(fā),盡量使用函數(shù)表達式的方式來聲明函數(shù)
3. 函數(shù)內(nèi)部屬性1.name屬性
函數(shù)名.name => 獲取字符串類型的函數(shù)名稱
// 外部 function fn1(){}; console.log(fn1.name); // fn1 // 內(nèi)部 function fn2() { console.log(fn2.name); // fn2 } fn2();
2.length屬性
函數(shù)名.length => 獲取形參的個數(shù),未傳參時返回0
// 外部 function fn1(a,b){}; console.log(fn1.length); // 2 // 內(nèi)部 function fn2(a,b,c) { console.log(fn2.length); // 3 } fn2();
3.caller屬性
函數(shù)名.caller => 獲得調(diào)用函數(shù)的函數(shù)引用(函數(shù)在哪被調(diào)用),如果在全局中調(diào)用當前函數(shù),值為null
var inner = function() { alert(inner.caller); }; var outer = function() { inner(); }; outer(); // function() { inner(); }; inner(); // null
4.arguments屬性
arguments只能在函數(shù)內(nèi)部使用,用來獲取傳入的實參。是一個偽數(shù)組
其內(nèi)部有如下屬性:
arguments.length:獲取實參的個數(shù)
arguments.callee:獲取當前函數(shù)的引用,一般用在匿名函數(shù)遞歸中
// 階乘 function factorial(num) { if(num <= 1) { return 1; } else { return num * arguments.callee(num - 1); } }
5.this屬性
this會在下一篇博客中詳細講解,先記住一句話:
this的指向和函數(shù)執(zhí)行的環(huán)境相關(guān),與它聲明的環(huán)境無關(guān)
形參:函數(shù)聲明時的參數(shù),起占位作用——函數(shù)名.length(形參個數(shù))
實參:函數(shù)調(diào)用時的參數(shù),實際參與運算的值—arguments.length(實參個數(shù))
當形參個數(shù)大于實參時,多余的形參將設(shè)置成undefined
當實參個數(shù)大于形參時,無法直接獲得所有的實參,通過arguments獲得實參
參數(shù)傳遞的理解:形參相當于一個具有局部作用域不需要聲明的和實參指向相同堆地址對象的值,其類型與實參相同
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/87424.html
摘要:因此,所有在方法中定義的變量都是放在棧內(nèi)存中的當我們在程序中創(chuàng)建一個對象時,這個對象將被保存到運行時數(shù)據(jù)區(qū)中,以便反復利用因為對象的創(chuàng)建成本通常較大,這個運行時數(shù)據(jù)區(qū)就是堆內(nèi)存。 上一篇:《javascript高級程序設(shè)計》筆記:繼承近幾篇博客都會圍繞著圖中的知識點展開 showImg(https://segmentfault.com/img/bVY0C4?w=1330&h=618);...
摘要:上一篇你不知道的筆記寫在前面這是年第一篇博客,回顧去年年初列的學習清單,發(fā)現(xiàn)僅有部分完成了。當然,這并不影響年是向上的一年在新的城市穩(wěn)定連續(xù)堅持健身三個月早睡早起游戲時間大大縮減,學會生活。 上一篇:《你不知道的javascript》筆記_this 寫在前面 這是2019年第一篇博客,回顧去年年初列的學習清單,發(fā)現(xiàn)僅有部分完成了。當然,這并不影響2018年是向上的一年:在新的城市穩(wěn)定、...
摘要:繼承和前面兩篇文章中的知識非常相關(guān),如果對函數(shù)創(chuàng)建原理和原型鏈不熟悉,請猛戳高級程序設(shè)計筆記創(chuàng)建對象高級程序設(shè)計筆記原型圖解繼承,通俗的說,就是將自身不存在的屬性或方法,通過某種方式為自己所用文章分別介紹原型鏈繼承繼承借用構(gòu)造函數(shù)繼承組合繼 繼承和前面兩篇文章中的知識非常相關(guān),如果對函數(shù)創(chuàng)建原理和原型鏈不熟悉,請猛戳:《javascript高級程序設(shè)計》筆記:創(chuàng)建對象《javascri...
摘要:解耦優(yōu)勢代碼復用,單元測試。常用比較誤區(qū)可同時判斷,可用來判斷對象屬性是否存在。使用作判斷無法進行充分的類型檢查。文件中應用常量參考文檔高級程序設(shè)計作者以樂之名本文原創(chuàng),有不當?shù)牡胤綒g迎指出。 showImg(https://segmentfault.com/img/bVburXw?w=500&h=400); 編寫可維護性代碼 可維護的代碼遵循原則: 可理解性 (方便他人理解) 直觀...
摘要:項目中我們可通過設(shè)置采集率,或?qū)σ?guī)定時間內(nèi)數(shù)據(jù)匯總再上報,減少請求數(shù)量,從而緩解服務(wù)端壓力。借鑒別人的一個例子只采集上報錯誤參考文檔高級程序設(shè)計如何優(yōu)雅處理前端異常作者以樂之名本文原創(chuàng),有不當?shù)牡胤綒g迎指出。 showImg(https://segmentfault.com/img/bVbnuud?w=640&h=640); 錯誤類型 即時運行錯誤 (代碼錯誤) 資源加載錯誤 常見...
摘要:變量的特點變量是松散類型的,所謂松散類型就是可以用來保存任何類型的數(shù)據(jù)。 變量的特點 js變量是松散類型的,所謂松散類型就是可以用來保存任何類型的數(shù)據(jù)。換句話說, 每個變量僅僅是一個用于保存值的占位符而已 js變量可以用來保存任何值,未經(jīng)過初始化的變量,會保存一個特殊的值—undefined,如:var msg; js變量的初始化并不會為它標記類型;初始化的過程就是給變量賦一個值那...
閱讀 1127·2021-10-09 09:43
閱讀 18610·2021-09-22 15:52
閱讀 1071·2019-08-30 15:44
閱讀 3064·2019-08-30 15:44
閱讀 3253·2019-08-26 14:07
閱讀 914·2019-08-26 13:55
閱讀 2576·2019-08-26 13:41
閱讀 3095·2019-08-26 13:29