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