摘要:通過可取可取的他們所屬對象的上下文的方法稱為公共方法函數(shù)調(diào)用模式當(dāng)一個(gè)函數(shù)并非一個(gè)對象的屬性時(shí),那么它就是被當(dāng)做一個(gè)函數(shù)來調(diào)用的,以此模式調(diào)用函數(shù),被綁定到了全局對象。
前言: 前端這兩年的新技術(shù)鋪天蓋地,各種框架、工具層出不窮眼花繚亂。最近打算好好復(fù)習(xí)下 js 基礎(chǔ),夯實(shí)的基礎(chǔ)才是學(xué)習(xí)新技術(shù)的基石。本文作為讀書筆記簡單的總結(jié)下 js 函數(shù)的基礎(chǔ)知識(shí)。
一、函數(shù)對象JavaScript中的函數(shù)就是對象。對象是“名/值”對的集合并擁有一個(gè)連接到原型對象的隱藏連接。對象字面量產(chǎn)生的對象連接到Object.prototype。函數(shù)對象連接到Function.prototype(該原型對象本身連接到Object.prototype)。
每個(gè)函數(shù)對象在創(chuàng)建時(shí)也會(huì)有一個(gè)prototype屬性。它的值是一個(gè)擁有constructor屬性且值即為該函數(shù)的對象。
函數(shù)是對象,可以保存在變量、對象和數(shù)組中。函數(shù)可以當(dāng)做參數(shù)傳遞給其他函數(shù),函數(shù)也可以在返回函數(shù),函數(shù)擁有方法。
二、函數(shù)字面量函數(shù)對象通過函數(shù)字面量來創(chuàng)建:
var add = function(a,b){
return a+b;
};
函數(shù)字面量包括四個(gè)部分:
1 保留字function
2 函數(shù)名(可省略)
3 包圍在括號中的一組參數(shù),在函數(shù)被調(diào)用是初始化為實(shí)際的參數(shù)的值
4 包圍在花括號里的一組語句塊
注意:一個(gè)內(nèi)部函數(shù)除了可以訪問自己的參數(shù)和變量,同時(shí)也可以自由的訪問父函數(shù)的參數(shù)和變量。用過這種函數(shù)字面量創(chuàng)建的函數(shù)對象包含一個(gè)連接到外部上下文的連接。這個(gè)被稱為閉包
三、函數(shù)調(diào)用每個(gè)函數(shù)接收兩個(gè)附加的參數(shù):this和arguments(實(shí)際參數(shù)),在JavaScript中有四種調(diào)用方式:方法調(diào)用模式,函數(shù)調(diào)用模式,構(gòu)造器調(diào)用模式和apply調(diào)用模式
方法調(diào)用模式當(dāng)有個(gè)函數(shù)被保存為對象的一個(gè)屬性是,我們稱他為一個(gè)方法。當(dāng)以個(gè)方法被調(diào)用時(shí),this被綁定到該對像。
var myObject = { value: 0, increment: function (icn) { this.value += typeof inc === "number" ? icn: 1; } } myObject.increment(); console.log(myObject.value); myObject.increment(2); console.log(myObject.value);
方法可以使用this訪問自己所屬的對象。通過this可取可取的他們所屬對象的上下文的方法稱為公共方法
函數(shù)調(diào)用模式當(dāng)一個(gè)函數(shù)并非一個(gè)對象的屬性時(shí),那么它就是被當(dāng)做一個(gè)函數(shù)來調(diào)用的,以此模式調(diào)用函數(shù),this被綁定到了全局對象。這是錯(cuò)誤的,正確的設(shè)計(jì)應(yīng)該是當(dāng)內(nèi)部函數(shù)被調(diào)用時(shí),this應(yīng)該綁定到外部函數(shù)的this變量。因此聲明一個(gè)that變量并賦值this,內(nèi)部函數(shù)就可以通過that訪問到this。這個(gè)聽起來比較難理解,我們以代碼的形式來說明
myObject.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(); console.log(myObject.value);構(gòu)造器調(diào)用模式
JavaScript是基于原型繼承的語言,對象可以直接從其他對象繼屬性,該語言是無類型的。
如果在一個(gè)函數(shù)前面帶上new來調(diào)用,name背地里就會(huì)創(chuàng)建一個(gè)連接到該函數(shù)的prototype成員的新對象,同時(shí)this會(huì)綁定到新對象上
//創(chuàng)建一個(gè)構(gòu)造器函數(shù)Quo var Quo = function(string){ this.status = string; }; //給Quo提供一個(gè)get_status的公共方法 Quo.prototype.get_status = function(){ return this.status; }; //構(gòu)造一個(gè)Quo實(shí)例 var myQuo = new Quo("hello world"); console.log(myQuo.get_status());Apply 調(diào)用模式
apply方法可以構(gòu)建一個(gè)參數(shù)數(shù)組傳遞給調(diào)用函數(shù),apply方法接收兩個(gè)數(shù)組,第一個(gè)是要綁定給this的值,第二個(gè)就是一個(gè)參數(shù)數(shù)組。
var array = [3,4];
var sum = add.apply(null,array);
var statusObject = { status: "A-ok" }; var status = Quo.prototype.get_status.apply(statusObject); console.log(status); //A-OK參數(shù)
當(dāng)函數(shù)被調(diào)用時(shí)會(huì)得到arguments數(shù)組,函數(shù)可以通過此參數(shù)訪問所有被它調(diào)用時(shí)傳遞的參數(shù)列表
arguments并不是一個(gè)真正的數(shù)組,擁有一個(gè)length屬性,但它沒有任何數(shù)組的方法返回
如果函數(shù)調(diào)用時(shí)在前面加一個(gè)new前綴,且返回值不是一個(gè)對象,則返回this
四、函數(shù)作用域我們已經(jīng)知道,在代碼外部添加包裝函數(shù)將內(nèi)部的變量和函數(shù)定義“隱藏”起來,外部作用域無法訪問包裝函數(shù)內(nèi)部的任何東西 例如:
var a = 2;閉包
function foo(){
var a =3;
consloe.log(a);//3
}
foo();
consloe.log(a);//2
內(nèi)部函數(shù)可以訪問定義在他們外部的函數(shù)的變量和參數(shù)(除了this、arguments)
var que = function(status){ return { get_status: function(){ return status; } } } var myQuo = que("hello"); console.log(myQuo.get_status());
get_status方法并不是訪問參數(shù)的副本,他訪問的就是參數(shù)的本身,這就是閉包,保護(hù)status為私有屬性
回調(diào)callBack()1 搞清異步和同步
function a(){ console.log("執(zhí)行a函數(shù)"); setTimeout(function(){ console.log("執(zhí)性a函數(shù)的延遲函數(shù)") },1000) }; function b (){ console.log("執(zhí)行函數(shù)b") } a(); b();
以上代碼會(huì)先執(zhí)行函數(shù)a,而且不會(huì)等到a中的延遲函數(shù)執(zhí)行完才執(zhí)行函數(shù)b, 在延遲函數(shù)被觸發(fā)的過程中就執(zhí)行了函數(shù)b,當(dāng)js引擎的event 隊(duì)列空閑時(shí)才會(huì)去執(zhí)行隊(duì)列里等待的setTimeout的回調(diào)函數(shù),這就是一個(gè)異步的例子
2回調(diào)函數(shù)到底是什么
以下是谷歌得出的結(jié)論
callback is a function that is passed as an argument to another function and is executed after its parent function has completed.模塊
我們可以使用函數(shù)和閉包來構(gòu)造模塊,模塊是一個(gè)提供個(gè)借口卻隱藏狀態(tài)與實(shí)現(xiàn)的函數(shù)或?qū)ο?/p>
模塊模式利用函數(shù)作用域和閉包來創(chuàng)建被綁定對象與私有成員的關(guān)聯(lián)
模塊的一般形式:一個(gè)定義了私有變量和函數(shù)的函數(shù);利用閉包創(chuàng)建可以訪問私有變量和函數(shù)的特權(quán),最后一個(gè)返回該特權(quán)函數(shù),或者把它們保存在一個(gè)可以訪問的到的地方
1、必須有外部的封裝函數(shù),該函數(shù)必須至少被調(diào)用一次(每次調(diào)用都會(huì)創(chuàng)建一個(gè)新的模塊實(shí)例)。
2、封閉函數(shù)必須返回至少一個(gè)尼日不函數(shù),這樣內(nèi)部函數(shù)才能在私有的作用域形成閉包,并且可以訪問或者可以修改私有狀態(tài)。
var foo= (function(){ var something = "cool"; var another =[1,2,3]; function doSomething(){ console.log(something); } function doAnother(){ console.log(another.join(" ! ")); } return{ doSomething: doSomething, doAnother: doAnother } })(); foo.doSomething(); foo.doAnother();
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/107688.html
摘要:一偽類當(dāng)一個(gè)函數(shù)對象被創(chuàng)建時(shí),構(gòu)造器產(chǎn)生的函數(shù)對象會(huì)運(yùn)行類似這樣的代碼新函數(shù)對象被賦予了一個(gè)屬性,他的值是一個(gè)包含屬性且屬性值為該新函數(shù)的對象。這個(gè)對象是存放繼承特征的地方。 一、偽類 當(dāng)一個(gè)函數(shù)對象被創(chuàng)建時(shí),F(xiàn)unction構(gòu)造器產(chǎn)生的函數(shù)對象會(huì)運(yùn)行類似這樣的代碼: this.prototype = { constructor: this}; 新函數(shù)對象被賦予了一個(gè)prototype...
摘要:前提中閉包無處不在,你只需要能夠識(shí)別并擁有它。一實(shí)質(zhì)問題當(dāng)函數(shù)可以記住并訪問所在的詞法作用域是,就產(chǎn)生了閉包。依然持有該作用域的引用。延遲函數(shù)的回調(diào)會(huì)在循環(huán)結(jié)束時(shí)才執(zhí)行。每個(gè)延遲函數(shù)都會(huì)講在每次迭代中創(chuàng)建的作用域封閉起來。 前提:JavaScript中閉包無處不在,你只需要能夠識(shí)別并擁有它。閉包是基于詞法作用域書寫代碼時(shí)自然產(chǎn)生的結(jié)果。 一、實(shí)質(zhì)問題 當(dāng)函數(shù)可以記住并訪問所在的詞法作用...
摘要:對象字面量數(shù)組運(yùn)行數(shù)組包括任意混合類型的數(shù)組。屬性的值是這些數(shù)組的最大整數(shù)屬性名加上。它等于數(shù)組里的屬性的個(gè)數(shù)??梢允褂孟驍?shù)組中增加元素,也可以用方式加入到數(shù)組中。六指定初始值數(shù)組通常不會(huì)預(yù)置頂。 一、數(shù)組字面量 數(shù)組字面量提供了一種非常方便的創(chuàng)建數(shù)組的表達(dá)法。 一個(gè)數(shù)組字面量是在一對方括號中包圍零個(gè)或多個(gè)用逗號分隔的值的表達(dá)式。 對象字面量數(shù)組: var numbers_obje...
摘要:深入之繼承的多種方式和優(yōu)缺點(diǎn)深入系列第十五篇,講解各種繼承方式和優(yōu)缺點(diǎn)。對于解釋型語言例如來說,通過詞法分析語法分析語法樹,就可以開始解釋執(zhí)行了。 JavaScript深入之繼承的多種方式和優(yōu)缺點(diǎn) JavaScript深入系列第十五篇,講解JavaScript各種繼承方式和優(yōu)缺點(diǎn)。 寫在前面 本文講解JavaScript各種繼承方式和優(yōu)缺點(diǎn)。 但是注意: 這篇文章更像是筆記,哎,再讓我...
閱讀 1664·2021-09-23 11:21
閱讀 2392·2021-09-07 10:13
閱讀 868·2021-09-02 10:19
閱讀 1159·2019-08-30 15:44
閱讀 1752·2019-08-30 13:18
閱讀 1938·2019-08-30 11:15
閱讀 1145·2019-08-29 17:17
閱讀 2040·2019-08-29 15:31