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