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