摘要:函數(shù)類型函數(shù)實(shí)際上是對(duì)象,因?yàn)槊總€(gè)函數(shù)都是這個(gè)構(gòu)造函數(shù)的實(shí)例,具有構(gòu)造函數(shù)定義的屬性和方法。而我們將這個(gè)函數(shù)參數(shù)拿出來,就可以更直觀的復(fù)用性更高的去編寫這個(gè)函數(shù),達(dá)到我們想要的效果。
函數(shù)類型
函數(shù)實(shí)際上是對(duì)象,因?yàn)槊總€(gè)函數(shù)都是Function這個(gè)構(gòu)造函數(shù)的實(shí)例,具有Funtion構(gòu)造函數(shù)定義的屬性和方法。函數(shù)名實(shí)際上時(shí)指向函數(shù)對(duì)象的指針,說明這個(gè)問題,看如下代碼:
function sum(a,b) { return a + b; } // 相當(dāng)于把sum的引用地址傳遞給sum2。 // 注意:不帶圓括號(hào)的函數(shù)名是訪問函數(shù)指針,而非調(diào)用函數(shù) var sum2 = sum; sum2(1,2) // 3 sum = null; sum(2,3) // undefined // 將sum的內(nèi)存回收,即sum的引用地址變了 sum2(2,3) //5 // 但sum2 還是指向原來的內(nèi)存地址1. 沒有重載
理解了上面之后,重載相當(dāng)于給函數(shù)變量重新修改了引用的值,因此后面會(huì)覆蓋前面的,很容易理解了。
2.函數(shù)提升其實(shí)和變量提升類似,就是聲明型函數(shù)和表達(dá)式定義函數(shù)的區(qū)別,很簡單
3.作為值的函數(shù)因?yàn)楹瘮?shù)名本身是變量,所以可以作為值進(jìn)行傳遞,這里有一個(gè)很好的例子,也是一個(gè)很好的編程思想,如下:
function getSomeFunction(fn,arg) { return fn(arg); } function add(num) { return num + 10; } function getGreeting(name) { return `Hello ${name}`; } getSomeFunction(add,5) // 15 getSomeFunction(getGreeting,"andy") // Hello andy
還可以從一個(gè)函數(shù)中返回另一個(gè)函數(shù)。例如我們?cè)谟脭?shù)組的一些排序方法或者迭代方法的時(shí)候,因?yàn)閭鬟f進(jìn)去的都是一個(gè)函數(shù)變量作為參數(shù),所以這個(gè)參數(shù)我們可以用“外部函數(shù)返回函數(shù)”的方法進(jìn)行編寫,這樣做的好處是,返回的函數(shù)可以把我們”特定想要規(guī)定”的參數(shù)傳遞進(jìn)去進(jìn)行計(jì)算,例如
// 規(guī)定利用哪個(gè)屬性進(jìn)行排序,如果不填則代表數(shù)組從大到小排序 function sortArgFuntion(compareProperty) { //compareProperty是上文中特定想要規(guī)定的參數(shù) return function (val1, val2) { if (compareProperty === undefined) { // 如果排序的是數(shù)組的值,則用常規(guī)的方法 if (val1 > val2) { return 1; } else if (val1 < val2) { return -1; } else { return 0; } } else { // 如果排序的是對(duì)象的屬性則用該方法 if (val1[compareProperty] > val2[compareProperty]) { return 1; } else if (val1[compareProperty] < val2[compareProperty]) { return -1; } else { return 0; } } } } var data = [{ name: "andy", age: 25 }, { name: "Nf", age: 29 }] data.sort(sortArgFuntion("name"))
sort函數(shù)的參數(shù)是個(gè)函數(shù),用于將數(shù)組進(jìn)行重排序。而我們將這個(gè)函數(shù)參數(shù)拿出來,就可以更直觀的、復(fù)用性更高的去編寫這個(gè)函數(shù),達(dá)到我們想要的效果。同時(shí)需要仔細(xì)揣摩,理解函數(shù)返回函數(shù)的精髓和獨(dú)到之處
4.函數(shù)內(nèi)部屬性函數(shù)內(nèi)部有兩個(gè)特殊變量
arguments
this
arguments是類數(shù)組對(duì)象,何為類數(shù)組對(duì)象呢?可以通過序號(hào)進(jìn)行數(shù)組式的訪問(如obj[1]),并且有l(wèi)ength屬性(對(duì)象你不定義length屬性,是沒有l(wèi)ength的).類數(shù)組只有索引值和長度,沒有數(shù)組的各種方法,所以如果要類數(shù)組調(diào)用數(shù)組的方法,就需要使用Array.prototype.method.call 來實(shí)現(xiàn)
thisthis是JavaScript非常容易混淆和復(fù)雜的一個(gè)知識(shí)點(diǎn),他代表什么完全取決于調(diào)用位置,我會(huì)但列出一篇總結(jié)this。e.g:
window.color = "red"; var o = {color:"blue"}; function sayColor() { console.log(this.color) } sayColor(); // red 因?yàn)檎{(diào)用位置是全局 o.sayColor = sayColor; o.sayColor(); // blue 因?yàn)檎{(diào)用位置是o的對(duì)象里
從上面例子中我們要知道,函數(shù)名字僅僅是一個(gè)指針,雖然執(zhí)行環(huán)境不同,全局的sayColor()和函數(shù)中的o.sayColor()指向的都是同一個(gè)函數(shù)
calleres5新加的,他返回當(dāng)前函數(shù)(必須是函數(shù),對(duì)象不行)的調(diào)用環(huán)境,如果調(diào)用環(huán)境是全局,則返回null。有兩種用法,一種是函數(shù)名加caller,一種是arguments.callee.caller
function outer() { console.log(outer.caller); //null inner(); }; function inner() { console.log(inner.caller); // outer里的代碼 }5.函數(shù)的屬性和方法
因?yàn)楹瘮?shù)也是對(duì)象,所以也有屬性和方法;函數(shù)里面有l(wèi)ength和prototype兩個(gè)屬性,length指?jìng)魅胄螀⒌膫€(gè)數(shù)
function add(num1,num2) {} console.log(add.length) // 2
對(duì)于引用類型而言,propertype是保存所有實(shí)例方法的真正所在。在創(chuàng)建自定義引用類型以及實(shí)現(xiàn)繼承,它的作用及其關(guān)鍵(到底多關(guān)鍵暫時(shí)還不太理解,尤其是繼承這個(gè)詞:)) es5中propertype不可枚舉,因此不能遍歷。
apply() 和 call()兩個(gè)參數(shù),第一個(gè)參數(shù)是在哪個(gè)作用域運(yùn)行,第二個(gè)參數(shù)apply是傳入的Array或者arguments對(duì)象,call是傳入每個(gè)值,其余他倆一模一樣。這是其中一個(gè)例子,用來說明apply和call的作用:
var color = "red"; var o = {color:"blue"}; function sayColor() { alert(this.color) } sayColor(); // red sayColor.call(this); // red sayColor.call(window); // red sayColor.call(o); // blue
如果不用call的話我們需要這樣做:
var color = "red"; var o = {color:"blue"}; function sayColor() { alert(this.color) } o.sayColor = sayColor; o.sayColor(); //blue
所以對(duì)比可以一目了然,call一個(gè)最大的作用是實(shí)現(xiàn)了對(duì)象和方法的解耦
bind方法bind方法用來構(gòu)建一個(gè)函數(shù)的實(shí)例,其this對(duì)象指向bind規(guī)定的作用域。e.g:
var color = "red"; var obj = {color:"blue"} function sayColor() { console.log(this.color); } var bindSayColor = sayColor.bind(obj); bindSayColor(); // blue
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/96558.html
摘要:理解的函數(shù)基礎(chǔ)要搞好深入淺出原型使用原型模型,雖然這經(jīng)常被當(dāng)作缺點(diǎn)提及,但是只要善于運(yùn)用,其實(shí)基于原型的繼承模型比傳統(tǒng)的類繼承還要強(qiáng)大。中文指南基本操作指南二繼續(xù)熟悉的幾對(duì)方法,包括,,。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處。 怎樣使用 this 因?yàn)楸救藢儆趥吻岸?,因此文中只看懂?8 成左右,希望能夠給大家?guī)韼椭?...(據(jù)說是阿里的前端妹子寫的) this 的值到底...
摘要:設(shè)計(jì)模式是以面向?qū)ο缶幊虨榛A(chǔ)的,的面向?qū)ο缶幊毯蛡鹘y(tǒng)的的面向?qū)ο缶幊逃行┎顒e,這讓我一開始接觸的時(shí)候感到十分痛苦,但是這只能靠自己慢慢積累慢慢思考。想繼續(xù)了解設(shè)計(jì)模式必須要先搞懂面向?qū)ο缶幊?,否則只會(huì)讓你自己更痛苦。 JavaScript 中的構(gòu)造函數(shù) 學(xué)習(xí)總結(jié)。知識(shí)只有分享才有存在的意義。 是時(shí)候替換你的 for 循環(huán)大法了~ 《小分享》JavaScript中數(shù)組的那些迭代方法~ ...
摘要:和類在開始時(shí)遇到類組件,只是需要有關(guān)類的基礎(chǔ)。畢竟,中的條件呈現(xiàn)僅再次顯示大多數(shù)是而不是特定的任何內(nèi)容。 在我的研討會(huì)期間,更多的材料是關(guān)于JavaScript而不是React。其中大部分歸結(jié)為JavaScript ES6以及功能和語法,但也包括三元運(yùn)算符,語言中的簡寫版本,此對(duì)象,JavaScript內(nèi)置函數(shù)(map,reduce,filter)或更常識(shí)性的概念,如:可組合性,可重用...
摘要:對(duì)象在中,除了數(shù)字字符串布爾值這幾個(gè)簡單類型外,其他的都是對(duì)象。那么在函數(shù)對(duì)象中,這兩個(gè)屬性的有什么區(qū)別呢表示該函數(shù)對(duì)象的原型表示使用來執(zhí)行該函數(shù)時(shí)這種函數(shù)一般成為構(gòu)造函數(shù),后面會(huì)講解,新創(chuàng)建的對(duì)象的原型。這時(shí)的函數(shù)通常稱為構(gòu)造函數(shù)。。 本文原發(fā)于我的個(gè)人博客,經(jīng)多次修改后發(fā)到sf上。本文仍在不斷修改中,最新版請(qǐng)?jiān)L問個(gè)人博客。 最近工作一直在用nodejs做開發(fā),有了nodejs,...
摘要:也就是說,所有的函數(shù)和構(gòu)造函數(shù)都是由生成,包括本身。如果只考慮構(gòu)造函數(shù)和及其關(guān)聯(lián)的原型對(duì)象,在不解決懸念的情況下,圖形是這樣的可以看到,每一個(gè)構(gòu)造函數(shù)和它關(guān)聯(lián)的原型對(duì)象構(gòu)成一個(gè)環(huán),而且每一個(gè)構(gòu)造函數(shù)的屬性無所指。 前言 JavaScript 是我接觸到的第二門編程語言,第一門是 C 語言。然后才是 C++、Java 還有其它一些什么。所以我對(duì) JavaScript 是非常有感情的,畢...
閱讀 3502·2023-04-26 02:00
閱讀 3095·2021-11-22 13:54
閱讀 1707·2021-08-03 14:03
閱讀 719·2019-08-30 15:52
閱讀 3098·2019-08-29 12:30
閱讀 2429·2019-08-26 13:35
閱讀 3375·2019-08-26 13:25
閱讀 3011·2019-08-26 11:39