摘要:語(yǔ)言精粹讀書(shū)筆記第四章函數(shù)函數(shù)字面量函數(shù)字面量包含個(gè)部分第一部分,保留字第二部分,函數(shù)名,它可以被忽略。這個(gè)超級(jí)延遲綁定使得函數(shù)對(duì)高度復(fù)用。構(gòu)造器調(diào)用模式一個(gè)函數(shù),如果創(chuàng)建的目的就是希望結(jié)合的前綴來(lái)調(diào)用,那它就被稱(chēng)為構(gòu)造器構(gòu)造。
《JavaScript 語(yǔ)言精粹》 讀書(shū)筆記 第四章 函數(shù) Functions 函數(shù)字面量
函數(shù)字面量包含4個(gè)部分:
第一部分, 保留字 function
第二部分, 函數(shù)名,它可以被忽略。沒(méi)有函數(shù)名,則被稱(chēng)為匿名函數(shù)
好處:
可以通過(guò)函數(shù)名,遞歸的調(diào)用自己。
此名字也可以被調(diào)試器和開(kāi)發(fā)工具用來(lái)識(shí)別函數(shù)。
第三部分, 包圍在圓括號(hào)中的一組參數(shù)。這些參數(shù)的名稱(chēng)將被定義為函數(shù)中的變量。它們不像普通的變量那樣將被初始化為undefined,而是在函數(shù)被調(diào)用時(shí)初始化為實(shí)際提供的參數(shù)的值。
第四部分, 包圍在花括號(hào)中的一組語(yǔ)句。也是函數(shù)的主體,它們?cè)诤瘮?shù)被調(diào)用時(shí)執(zhí)行
通過(guò)函數(shù)字面量創(chuàng)建的函數(shù)對(duì)象包含一個(gè)連接到外部上下文的連接。這被稱(chēng)為閉包(closure),它是JavaScript強(qiáng)大表現(xiàn)力的來(lái)源。
調(diào)用 Invocation調(diào)用一個(gè)函數(shù)會(huì)暫停當(dāng)前函數(shù)的執(zhí)行,傳遞控制權(quán)和參數(shù)給新函數(shù),除了聲明時(shí)定義的形式參數(shù),每個(gè)函數(shù)還連接兩個(gè)附加的參數(shù):this 和 arguments
this 的值取決于調(diào)用的模式
在JavaScript中一共有4種調(diào)用模式:
方法調(diào)用模式
函數(shù)調(diào)用模式
構(gòu)造器調(diào)用模式
apply調(diào)用模式
調(diào)用運(yùn)算符:跟在任何產(chǎn)生一個(gè)函數(shù)值的表達(dá)式之后的一對(duì)圓括號(hào)()。表達(dá)式內(nèi)可包含零個(gè)或多個(gè)用逗號(hào)隔開(kāi)的表達(dá)式。 每個(gè)表達(dá)式產(chǎn)生一個(gè)參數(shù)值,es6語(yǔ)法中可以設(shè)置默認(rèn)參數(shù)。如果實(shí)際參數(shù)值過(guò)多,超出的參數(shù)值會(huì)被忽略。過(guò)少,缺失的值會(huì)被替換為undefined。任何類(lèi)型的值都可以被傳遞給任何參數(shù)。
方法調(diào)用模式 The Method Invocation Pattern
當(dāng)一個(gè)函數(shù)被保存為對(duì)象的一個(gè)屬性時(shí),我們稱(chēng)它為一個(gè)方法。方法被調(diào)用時(shí),this被綁定在該對(duì)象。如果調(diào)用表達(dá)式包含一個(gè)提取屬性的動(dòng)作(.點(diǎn)表達(dá)式或者[subscript]下標(biāo)表達(dá)式),那么它就是被當(dāng)做一個(gè)方法來(lái)調(diào)用。
var myObject = { value:0, increment:function(inc) { this.value += typeof inc === "number"?inc:1; } }; myObject.increment(); document.write(myObject.value); // 1 myObject.increment(2); document.write(myObject.value); //3
this 到對(duì)象的綁定發(fā)生在調(diào)用的時(shí)候。這個(gè)“超級(jí)”延遲綁定(very late binding)使得函數(shù)對(duì)this高度復(fù)用。
通過(guò)this可獲取它們所屬對(duì)象的上下文的方法稱(chēng)為公共方法(public method)
函數(shù)調(diào)用模式 The Function Invocation Pattern
當(dāng)一個(gè)函數(shù)并非一個(gè)對(duì)象的屬性時(shí),那么它就是被當(dāng)做一個(gè)函數(shù)來(lái)調(diào)用:
var sum = add(3,4)
this 被綁定到了全局對(duì)象上了。倘若語(yǔ)言設(shè)計(jì)正確,那么當(dāng)內(nèi)部函數(shù)被調(diào)用時(shí),this應(yīng)該仍然綁定外部函數(shù)的this變量。通常定義一個(gè) that變量,并給它賦值為this。
muyObject.double = function(){ var that = this; // 解決方法 var helper = function(){ that.value = add(that.value,that.value); } helper(); // 以函數(shù)的形式調(diào)用helper } // 以方法的形式調(diào)用double 。 myObject.double(); document.writeln(myObject.value) // 6;
構(gòu)造器調(diào)用模式
一個(gè)函數(shù),如果創(chuàng)建的目的就是希望結(jié)合new的前綴來(lái)調(diào)用,那它就被稱(chēng)為構(gòu)造器構(gòu)造。
按照約定,它們保存在以大寫(xiě)格式命名的變量里
JavaScript 是一門(mén)基于原型繼承的語(yǔ)言。這意味著對(duì)象可以直接從其他對(duì)象繼承屬性,同時(shí),他也提供了一套和基于類(lèi)的語(yǔ)言類(lèi)似的對(duì)象構(gòu)建語(yǔ)法。
如果在一個(gè)函數(shù)前面帶上 new 來(lái)調(diào)用。那么背地里將會(huì)創(chuàng)建一個(gè)連接到該函數(shù)的 prototype成員的新對(duì)象,同時(shí) this 會(huì)被綁定到那個(gè)新對(duì)象上。
// 創(chuàng)建一個(gè)名為Quo的構(gòu)造器函數(shù),它構(gòu)造一個(gè)帶有status屬性的對(duì)象 var Quo = function(string) { this.status = string; } // 給Quo的所有實(shí)例提供一個(gè)名為get_status的公共方法 Quo.prototype.get_status = function() { return this.status } // 構(gòu)造一個(gè)Quo 實(shí)例 var myQuo = new Quo("confused") document.writeln(myQuo.get_status()); // 顯示 "confused"
Apply調(diào)用模式
JavaScript 是一門(mén)函數(shù)式的面向?qū)ο缶幊陶Z(yǔ)言,所以函數(shù)可以擁有方法。
apply方法讓我們構(gòu)建一個(gè)參數(shù)數(shù)組傳遞給調(diào)用函數(shù),同時(shí)允許我們選擇this的值。
接收兩個(gè)參數(shù),第一個(gè)是要綁定給this的值,第二個(gè)就是一個(gè)參數(shù)數(shù)組。
// 構(gòu)造一個(gè)包含兩個(gè)數(shù)字的數(shù)組,并將它們相加。 var array = [3,4]; var sum = add.apply(null,array); // sum 值為7 // 構(gòu)造一個(gè)包含status 成員的對(duì)象。 var statusObject = { status:"A-OK" }; // statusObject 并沒(méi)有繼承自Quo.prototype , // 但我們可以在 statusObject上調(diào)用get_status方法,盡管statusObject 并沒(méi)有一個(gè)名為get_status的方法。 var status = Quo.prototype.get_status.apply(statusObject); // status 值為 "A-OK"
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/92976.html
摘要:對(duì)象被傳遞到從句中被捕獲。一些語(yǔ)言提供了尾遞歸優(yōu)化。這意味著如果一個(gè)函數(shù)返回自身遞歸調(diào)用的結(jié)果,那么調(diào)用的過(guò)程會(huì)被替換為一個(gè)循環(huán),可以顯著提高速度。構(gòu)建一個(gè)帶尾遞歸的函數(shù)。語(yǔ)言精粹讀書(shū)筆記函數(shù) 第四章 函數(shù) Functions (二) 參數(shù) arguments arguments數(shù)組: 函數(shù)可以通過(guò)此參數(shù)訪問(wèn)所有它被調(diào)用時(shí)傳遞給它的參數(shù)列表,包括哪些沒(méi)有被分配給函數(shù)聲明時(shí)定義的形式參數(shù)...
摘要:使用構(gòu)造器有個(gè)嚴(yán)重的危害,如果在調(diào)用構(gòu)造器函數(shù)的時(shí)候忘記使用前綴,不僅不會(huì)綁定到新對(duì)象,還會(huì)污染全局變量原型模式原型模式中,我們采用對(duì)象來(lái)繼承。 構(gòu)造器調(diào)用模式 當(dāng)一個(gè)函數(shù)對(duì)象被創(chuàng)建時(shí),F(xiàn)unction構(gòu)造器會(huì)運(yùn)行類(lèi)似這樣的代碼: this.prototype = {constructor: this} new一個(gè)函數(shù)事會(huì)發(fā)生: Function.method(new, functio...
摘要:第條盡量少使用全局對(duì)象避免聲明全局變量盡量聲明局部變量避免對(duì)全局變量增加屬性第條始終聲明局部變量第條避免使用語(yǔ)句第條熟練使用閉包的函數(shù)值包含了比調(diào)用他們時(shí)執(zhí)行所需要的代碼還要更多的信息。那些在其所涵蓋的作用域內(nèi)跟蹤變量的函數(shù)稱(chēng)為閉包。 書(shū)還沒(méi)看完。一遍看,一遍寫(xiě)讀書(shū)筆記。 這本書(shū)的序是JavaScript之父Brendan Eich寫(xiě)的,作者是JavaScript標(biāo)準(zhǔn)化委員會(huì)專(zhuān)家??上?..
摘要:于是我就先把這本薄的經(jīng)典書(shū)語(yǔ)言精粹修訂版豆瓣讀書(shū)本書(shū)簡(jiǎn)介總共章,除去附錄,才頁(yè),讀完并記錄了一些筆記。讀書(shū)筆記還可以分享給別人看。編程語(yǔ)言第版定義了的標(biāo)準(zhǔn)。程序檢查時(shí)丟棄值為函數(shù)的屬性。 之前看到這篇文章,前端網(wǎng)老姚淺談:怎么學(xué)JavaScript?,說(shuō)到怎么學(xué)習(xí)JavaScript,那就是看書(shū)、分析源碼。10本書(shū)讀2遍的好處,應(yīng)該大于一本書(shū)讀20遍??磿?shū)主動(dòng)學(xué)習(xí),看視頻是被動(dòng)學(xué)習(xí)???..
摘要:遞歸函數(shù)就是會(huì)直接或者間接地調(diào)用自身的一種函數(shù)。一般來(lái)說(shuō),一個(gè)遞歸函數(shù)調(diào)用自身去解決它的子問(wèn)題。書(shū)上第二個(gè)例子是說(shuō)遞歸函數(shù)可以非常高效率的操作樹(shù)形結(jié)構(gòu),比如。有一些語(yǔ)言提供了尾遞歸的優(yōu)化。好運(yùn)的是,給我們帶來(lái)了尾遞歸,詳細(xì)迎接使用尾遞歸。 遞歸函數(shù)就是會(huì)直接或者間接地調(diào)用自身的一種函數(shù)。遞歸是一種強(qiáng)大的編程技術(shù),它把一問(wèn)題分解為一組相似的子問(wèn)題,每一個(gè)都用一個(gè)尋常解去解決。一般來(lái)...
閱讀 3984·2021-11-24 10:46
閱讀 1842·2021-11-16 11:44
閱讀 2330·2021-09-22 16:02
閱讀 1445·2019-08-30 15:55
閱讀 1157·2019-08-30 12:46
閱讀 594·2019-08-28 18:31
閱讀 2822·2019-08-26 18:38
閱讀 1122·2019-08-23 16:51