摘要:函數(shù)調(diào)用有如下四種調(diào)用函數(shù)的方式作為函數(shù)作為方法作為構(gòu)造函數(shù)通過(guò)和返回函數(shù)的函數(shù)當(dāng)函數(shù)無(wú)明確返回值時(shí),返回的值就是。直接聲明一個(gè)匿名函數(shù),立即使用。規(guī)定當(dāng)發(fā)生事件時(shí)運(yùn)行的函數(shù)這種形式在中經(jīng)常見(jiàn)到。
概念
函數(shù)是由事件驅(qū)動(dòng)的或者當(dāng)它被調(diào)用時(shí)執(zhí)行的可重復(fù)使用的代碼塊。
js 支持兩種函數(shù):一類(lèi)是語(yǔ)言?xún)?nèi)部的函數(shù)(如eval() ),另一類(lèi)是自己創(chuàng)建的。
在 JavaScript 函數(shù)內(nèi)部聲明的變量(使用 var)是局部變量,所以只能在函數(shù)內(nèi)部訪(fǎng)問(wèn)它。(該變量的作用域是局部的)。
您可以在不同的函數(shù)中使用名稱(chēng)相同的局部變量,因?yàn)橹挥新暶鬟^(guò)該變量的函數(shù)才能識(shí)別出該變量。
函數(shù)調(diào)用有如下四種調(diào)用js函數(shù)的方式:
作為函數(shù)
作為方法
作為構(gòu)造函數(shù)
通過(guò)call()和apply()
返回函數(shù)的函數(shù)1. 當(dāng)函數(shù)無(wú)明確返回值時(shí),返回的值就是`undefined`。 2. 當(dāng)函數(shù)有返回值時(shí),返回值是什么就返回什么。
我們可以通過(guò)使用 return 語(yǔ)句實(shí)現(xiàn)將函數(shù)返回調(diào)用它的地方。
在使用 return 語(yǔ)句時(shí),函數(shù)會(huì)停止執(zhí)行,并返回指定的值。
函數(shù)通常會(huì)返回一個(gè)唯一值,那么這個(gè)值也可能是另一個(gè)函數(shù):
在這里,我們只需將返回值賦值給某個(gè)變量,然后就可以像使用一般函數(shù)那樣調(diào)用它了:
如果想讓返回的函數(shù)立即執(zhí)行,亦可以使用box()()來(lái)執(zhí)行這段代碼。
ECMAScript所有函數(shù)的參數(shù)都是按值傳遞的,言下之意就是參數(shù)不會(huì)按引用傳遞。
PS:如果存在按引用傳遞的話(huà),那么函數(shù)里的那個(gè)變量將會(huì)是全局變量,在外部也可以訪(fǎng)問(wèn)。
(1)值類(lèi)型:數(shù)值、布爾值、null、undefined。 (2)引用類(lèi)型:對(duì)象、數(shù)組、函數(shù)。
引用類(lèi)型值:指的是那些保存在堆內(nèi)存中的對(duì)象,意思是,變量中保存的實(shí)際上只是一個(gè)指針,這個(gè)指針執(zhí)行內(nèi)存中的另一個(gè)位置,由該位置保存對(duì)象;
創(chuàng)建匿名函數(shù)function(){ return ‘hi’; //多帶帶的匿名函數(shù)是無(wú)法運(yùn)行的,就算能運(yùn)行也無(wú)法調(diào)用,因?yàn)闆](méi)有名字 }
這種匿名函數(shù)的用法在JQuery中非常多。直接聲明一個(gè)匿名函數(shù),立即使用。用匿名函數(shù)的好處就是省得定義一個(gè)用一次就不用的函數(shù),而且免了命名沖突的問(wèn)題,js中沒(méi)有命名空間的概念,因此很容易函數(shù)名字沖突,一旦命名沖突以最后聲明的為準(zhǔn)。
在javascript語(yǔ)言里任何匿名函數(shù)都是屬于window對(duì)象。在定義匿名函數(shù)時(shí)候它會(huì)返回自己的內(nèi)存地址,如果此時(shí)有個(gè)變量接收了這個(gè)內(nèi)存地址,那么匿名函數(shù)就能在程序里被使用了,因?yàn)槟涿瘮?shù)也是在全局執(zhí)行環(huán)境構(gòu)造時(shí)候定義和賦值,所以匿名函數(shù)的this指向也是window對(duì)象
(function(){ console.log(this === window);//true })();
通過(guò)自我執(zhí)行來(lái)執(zhí)行匿名函數(shù):
//通過(guò)自我執(zhí)行來(lái)執(zhí)行匿名函數(shù)
把匿名函數(shù)自我執(zhí)行的返回值賦給變量:
//把匿名函數(shù)自我執(zhí)行的返回值賦給變量 var box= (function () { return "hi"; })(); console.log(box);//hi
自我執(zhí)行匿名函數(shù)的傳參:
//自我執(zhí)行匿名函數(shù)的傳參自執(zhí)行函數(shù)的三種寫(xiě)法
var result = function (){ alert(2); }();
另一種語(yǔ)法也可得到同樣結(jié)果:
var result = (function () { console.log(2); })();
將函數(shù)返回值分配給變量:
var result = (function () { return 2; }());js創(chuàng)建動(dòng)態(tài)函數(shù):
js支持創(chuàng)建動(dòng)態(tài)函數(shù),動(dòng)態(tài)函數(shù)必須用Function對(duì)象來(lái)定義(Function是js中的一個(gè)對(duì)象,是固定不變的,規(guī)定Function對(duì)象的"F"必須大寫(xiě),當(dāng)是function的時(shí)候,我們知道是定義函數(shù)的時(shí)候所使用的一個(gè)關(guān)鍵字:function funName(x,y),當(dāng)是Function的時(shí)候(F大寫(xiě)的時(shí)候),我們知道是js中的對(duì)象)
創(chuàng)建動(dòng)態(tài)函數(shù)的基本格式:var 變量名 = new Function("參數(shù)1","參數(shù)2","參數(shù)n","執(zhí)行語(yǔ)句");
看下面的一段代碼:
square是動(dòng)態(tài)創(chuàng)建的函數(shù),在Function對(duì)象后面的括號(hào)里的每一部分內(nèi)容都必須是字符串形式的,也就是說(shuō)都必須用引號(hào)(""或者是"")括起來(lái)
這段代碼:
var square = new Function ("x","y","var sum ; sum = x+y;return sum;");
和下面這段代碼:
//函數(shù)聲明 function square (x,y){ var sum; sum = x+y; return sum; }
是一摸一樣的,只不過(guò)一個(gè)是動(dòng)態(tài)函數(shù),一個(gè)是靜態(tài)函數(shù)。
我們?yōu)槭裁匆汛a分成一小段一小段的代碼呢?,把一個(gè)字符串分成了若干個(gè)獨(dú)立的字符串的優(yōu)點(diǎn)就在于我們可以通過(guò)修改其中的某些字符串來(lái)隨時(shí)改變函數(shù)的作用。
回調(diào)就是一個(gè)函數(shù)的調(diào)用過(guò)程。那么就從理解這個(gè)調(diào)用過(guò)程開(kāi)始吧。函數(shù)a有一個(gè)參數(shù),這個(gè)參數(shù)是個(gè)函數(shù)b,當(dāng)函數(shù)a執(zhí)行完以后執(zhí)行函數(shù)b。那么這個(gè)過(guò)程就叫回調(diào)。
其實(shí)中文也很好理解:回調(diào),回調(diào),就是回頭調(diào)用的意思。函數(shù)a的事先干完,回頭再調(diào)用函數(shù)b。
這里必須清楚一點(diǎn):函數(shù)b是你以參數(shù)形式傳給函數(shù)a的,那么函數(shù)b就叫回調(diào)函數(shù)。
在jquery里的絕大多數(shù)效果函數(shù)都涉及到callback函數(shù)。jquery效果函數(shù)
例如:
這里的callback function換成實(shí)例可以是:
Callback實(shí)際上是,當(dāng)一個(gè)函數(shù)執(zhí)行完后,現(xiàn)執(zhí)行的那個(gè)函數(shù)就是所謂的callback函數(shù)。怎么樣?很好理解吧……
方法和函數(shù)的區(qū)別var arr = [1,2,3,4,5] var a =12; // 變量:自由的 arr.a= 5; //屬性:屬于一個(gè)對(duì)象 function show() //函數(shù):自由的 { alert(‘a(chǎn)’); } arr.fn = function() //方法:屬于一個(gè)對(duì)象 { alert(‘b’); }
其實(shí)方法就是函數(shù),只不過(guò)方法是有所屬的對(duì)象。
我們所熟知的,將函數(shù)綁定到 click 事件
語(yǔ)法:
$(selector).click(function)
參數(shù) | 描述 |
---|---|
function | 可選。規(guī)定當(dāng)發(fā)生 click 事件時(shí)運(yùn)行的函數(shù). |
這種形式在jquery中經(jīng)常見(jiàn)到。它是將function當(dāng)做該方法的參數(shù),向該方法添加一個(gè)事件處理函數(shù)。
js全局函數(shù)全局函數(shù)與內(nèi)置對(duì)象的屬性或方法不是一個(gè)概念。全局函數(shù)它不屬于任何一個(gè)內(nèi)置對(duì)象。
JavaScript 中包含以下 7 個(gè)全局函數(shù),用于完成一些常用的功能:
escape( )、eval( )、isFinite( )、isNaN( )、parseFloat( )、 parseInt( )、unescape( )。函數(shù)的幾個(gè)作用 作為一個(gè)類(lèi)構(gòu)造器使用
function Class(){} Class.prototype={}; var item=new Class();作為閉包使用
(function(){ //獨(dú)立作用域 })();作為構(gòu)造函數(shù)調(diào)用
所謂構(gòu)造函數(shù),就是通過(guò)這個(gè)函數(shù)生成一個(gè)新對(duì)象(object)。
可以使用 new 運(yùn)算符結(jié)合像 Object()、Date() 和 Function() 這樣的預(yù)定義的構(gòu)造函數(shù)來(lái)創(chuàng)建對(duì)象并對(duì)其初始化。面向?qū)ο蟮木幊唐鋸?qiáng)有力的特征是定義自定義構(gòu)造函數(shù)以創(chuàng)建腳本中使用的自定義對(duì)象的能力。創(chuàng)建了自定義的構(gòu)造函數(shù),這樣就可以創(chuàng)建具有已定義屬性的對(duì)象。下面是自定義函數(shù)的示例(注意 this 關(guān)鍵字的使用)。
function Circle (xPoint, yPoint, radius) { this.x = xPoint; // 圓心的 x 坐標(biāo)。 this.y = yPoint; // 圓心的 y 坐標(biāo)。 this.r = radius; // 圓的半徑。 }
調(diào)用 Circle 構(gòu)造函數(shù)時(shí),給出圓心點(diǎn)的值和圓的半徑(所有這些元素是完全定義一個(gè)獨(dú)特的圓對(duì)象所必需的)。結(jié)束時(shí) Circle 對(duì)象包含三個(gè)屬性。下面是如何例示 Circle 對(duì)象。
var aCircle = new Circle(5, 11, 99);
使用構(gòu)造器函數(shù)的優(yōu)點(diǎn)是,它可以根據(jù)參數(shù)來(lái)構(gòu)造不同的對(duì)象。 缺點(diǎn)是構(gòu)造時(shí)每個(gè)實(shí)例對(duì)象都會(huì)生成重復(fù)調(diào)用對(duì)象的方法,造成了內(nèi)存的浪費(fèi)。
依照慣例,我們應(yīng)該將構(gòu)造器函數(shù)的首字母大寫(xiě),以便顯著地區(qū)別于一般的函數(shù)。
以下兩種形式的定義函數(shù)方式是等價(jià)的。
這里明確定義了一個(gè)變量test,他的初始值被賦予了一個(gè)function實(shí)體
看看下面這種定義式函數(shù)形式:
很顯然,第一個(gè)函數(shù)并沒(méi)有起到作用,很奇怪不是嗎?我們知道,javascript解析引擎并不是一行一行地執(zhí)行代碼,而是一段一段地執(zhí)行代碼。在同一段程序的分析執(zhí)行中,定義式的函數(shù)語(yǔ)句會(huì)被優(yōu)先執(zhí)行,所以第一個(gè)定義的代碼邏輯已經(jīng)被第二個(gè)覆蓋了,所以?xún)纱握{(diào)用相同函數(shù),只會(huì)執(zhí)行第二個(gè)。
作為值的函數(shù)函數(shù)在js中不僅是一種語(yǔ)法,也是一個(gè)值。也就是說(shuō)可以將函數(shù)賦值給變量,存儲(chǔ)在對(duì)象的屬性或數(shù)組的元素中,作為參數(shù)傳入另一個(gè)函數(shù)中。
函數(shù)的名字實(shí)際是看不見(jiàn)的,它僅僅是變量的名字,這個(gè)變量指代函數(shù)對(duì)象
除了可以將函數(shù)賦值給變量,同樣可以將函數(shù)賦值給對(duì)象的屬性,當(dāng)函數(shù)作為對(duì)象的屬性調(diào)用時(shí),函數(shù)就稱(chēng)為方法
prototype屬性
每一個(gè)函數(shù)都包含prototype屬性,這個(gè)屬性指向一個(gè)對(duì)象的引用,這個(gè)對(duì)象稱(chēng)為原型對(duì)象。
詳見(jiàn):javascript學(xué)習(xí)總結(jié)(五)原型和原型鏈
apply()函數(shù)有兩個(gè)參數(shù):第一個(gè)參數(shù)是上下文,第二個(gè)參數(shù)是參數(shù)組成的數(shù)組。如果上下文是null,則使用全局對(duì)象代替。例如:
function.apply(this,[1,2,3])
call()的第一個(gè)參數(shù)是上下文,后續(xù)是實(shí)例傳入的參數(shù)序列,例如:
function.call(this,1,2,3);高階函數(shù)
這里的高階函數(shù)可不是高數(shù)里的那個(gè)高階函數(shù),所謂高階函數(shù)就是操作函數(shù)的函數(shù),它接收一個(gè)或多個(gè)函數(shù)作為參數(shù),并返回新函數(shù)
參數(shù)arguments當(dāng)函數(shù)被調(diào)用時(shí),會(huì)得到一個(gè)免費(fèi)奉送的參數(shù)數(shù)組,那就是arguments數(shù)組。通過(guò)它,函數(shù)可以訪(fǎng)問(wèn)所有它被調(diào)用時(shí)傳遞給他的參數(shù)列表。這使得編寫(xiě)一個(gè)無(wú)需指定參數(shù)個(gè)數(shù)的函數(shù)成為可能。
在ECMAScript中的參數(shù)在內(nèi)部是用一個(gè)數(shù)組來(lái)表示的,函數(shù)接收到的始終都是這個(gè)數(shù)組,而不關(guān)心數(shù)組中包含哪些參數(shù)
function add(num1,num2){ num = num1 + num2; return num; } var result = 12,count = 20; alert(add(result,count));//32;命名的參數(shù)只提供便利,解析器不會(huì)驗(yàn)證命名參數(shù)
實(shí)際上,arguments并不是一個(gè)真正的數(shù)組,它只是一個(gè)類(lèi)數(shù)組的對(duì)象,它擁有一個(gè)length屬性,但他缺少所有數(shù)組的方法。另外,arguments對(duì)象的長(zhǎng)度是由傳入的參數(shù)個(gè)數(shù)決定的,而不是由定義函數(shù)時(shí)的命名參數(shù)的個(gè)數(shù)決定的
函數(shù)在定義或者聲明的時(shí)候,所有的參數(shù)都是形參,因此,我們可以根據(jù)實(shí)際情況來(lái)命名參數(shù),函數(shù)也只有在被調(diào)用時(shí)才會(huì)傳入實(shí)參。而每個(gè)函數(shù)在被調(diào)用時(shí)都會(huì)自動(dòng)取得兩個(gè)特殊變量:this 和 arguments
函數(shù)的遞歸函數(shù)的遞歸,即一個(gè)函數(shù)在通過(guò)名字調(diào)用自身的情況下構(gòu)成的:
通過(guò)使用argument.callee代替函數(shù)名:
//arguments.callee是一個(gè)指向正在執(zhí)行的函數(shù)的指針思維導(dǎo)圖
最后附上一張前輩總結(jié)的思維導(dǎo)圖:
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/87623.html
摘要:前綴規(guī)范每個(gè)局部變量都需要有一個(gè)類(lèi)型前綴,按照類(lèi)型可以分為表示字符串。例如,表示以上未涉及到的其他對(duì)象,例如,表示全局變量,例如,是一種區(qū)分大小寫(xiě)的語(yǔ)言。布爾值與字符串相加將布爾值強(qiáng)制轉(zhuǎn)換為字符串。 基本概念 javascript是一門(mén)解釋型的語(yǔ)言,瀏覽器充當(dāng)解釋器。js執(zhí)行時(shí),在同一個(gè)作用域內(nèi)是先解釋再執(zhí)行。解釋的時(shí)候會(huì)編譯function和var這兩個(gè)關(guān)鍵詞定義的變量,編譯完成后從...
摘要:函數(shù)式編程前端掘金引言面向?qū)ο缶幊桃恢币詠?lái)都是中的主導(dǎo)范式。函數(shù)式編程是一種強(qiáng)調(diào)減少對(duì)程序外部狀態(tài)產(chǎn)生改變的方式。 JavaScript 函數(shù)式編程 - 前端 - 掘金引言 面向?qū)ο缶幊桃恢币詠?lái)都是JavaScript中的主導(dǎo)范式。JavaScript作為一門(mén)多范式編程語(yǔ)言,然而,近幾年,函數(shù)式編程越來(lái)越多得受到開(kāi)發(fā)者的青睞。函數(shù)式編程是一種強(qiáng)調(diào)減少對(duì)程序外部狀態(tài)產(chǎn)生改變的方式。因此,...
因?yàn)樽罱胁┯逊答佄业牟┪氖侵苯臃g的參考鏈接內(nèi)的內(nèi)容,所以我在這里要說(shuō)明一下,以免引起不必要的誤會(huì)。 首先,我很喜歡 segmentfault 的交流和學(xué)習(xí)的氛圍,所以我很愿意在這里跟各位 SFer 交流學(xué)習(xí)心得,相互學(xué)習(xí),共同進(jìn)步。 第二,我做技術(shù)方面的工作不久,所以學(xué)習(xí)經(jīng)歷也不是很長(zhǎng),但是我發(fā)現(xiàn)寫(xiě)博客,總結(jié)自己的學(xué)習(xí)心得是個(gè)很好的學(xué)習(xí)習(xí)慣,至少對(duì)于我個(gè)人而言,我于此收益頗豐,所以我決定堅(jiān)持一...
摘要:布爾值表示捕獲階段調(diào)用事件處理程序,表示冒泡階段通過(guò)對(duì)象的方法,也可以定義事件的回調(diào)函數(shù)。對(duì)象會(huì)被作為第一個(gè)參數(shù)傳遞給事件監(jiān)聽(tīng)的回調(diào)函數(shù)。布爾默認(rèn)值是,當(dāng)設(shè)置成時(shí)用以取消事件的默認(rèn)行為與中的相同。 其實(shí)這篇文章挺早之前就寫(xiě)了,但是由于sf保存方面的bug,所以當(dāng)時(shí)寫(xiě)了一大堆,結(jié)果沒(méi)保存,覺(jué)得這個(gè)沒(méi)寫(xiě)完是個(gè)不小的遺憾,今天正好有空,就給補(bǔ)充下了,也正好給我的javascript學(xué)習(xí)總結(jié)做...
摘要:并列數(shù)據(jù)的集合數(shù)組用方括號(hào)表示。第三種類(lèi)型是映射,也就是一個(gè)名值對(duì),即數(shù)據(jù)有一個(gè)名稱(chēng),還有一個(gè)與之相對(duì)應(yīng)的值,這又稱(chēng)作散列或字典,比如首都北京。中有種簡(jiǎn)單數(shù)據(jù)類(lèi)型也稱(chēng)為基本數(shù)據(jù)類(lèi)型和。數(shù)值布爾值對(duì)象和字符串值都有方法。 什么是JSON JSON:JavaScript 對(duì)象表示法(JavaScript Object Notation)。 JSON的形式是用大括號(hào){}包圍起來(lái)的項(xiàng)目列表...
閱讀 2006·2021-11-24 10:45
閱讀 1861·2021-10-09 09:43
閱讀 1303·2021-09-22 15:38
閱讀 1230·2021-08-18 10:19
閱讀 2849·2019-08-30 15:55
閱讀 3069·2019-08-30 12:45
閱讀 2975·2019-08-30 11:25
閱讀 365·2019-08-29 11:30