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