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