ES5中的函數(shù)

1.在ES5中函數(shù)定義有兩種方式:

函數(shù)聲明:?function functionName(arg){}

函數(shù)表達(dá)式:var functionName = function(arg){}

這兩種方式定義的函數(shù)都可以使用,但是他們還是有一些區(qū)別的

1.函數(shù)聲明方式定義的函數(shù),會(huì)有函數(shù)聲明提升的,即你可以在函數(shù)聲明之前調(diào)用改函數(shù),而函數(shù)表達(dá)式定義的函數(shù)不可以

2.匿名函數(shù),匿名函數(shù)顧名思義就是其函數(shù)沒(méi)有方法名字

function createCompareFunction(property){

return function (obj1,obj2){

var value1 = obj1[property];

var value2 = obj2[property];

if (value1 < value2){

return -1;

}else if (value1 > value2){

return 1;

}else{

return 0;

}

}

}

如上代碼所示,createCompareFunction就會(huì)返回一個(gè)匿名函數(shù)

3 es5中的遞歸函數(shù),可以使用arguments.callee(這個(gè)指向了當(dāng)前正在執(zhí)行的函數(shù))來(lái)實(shí)現(xiàn),避免函數(shù)表達(dá)式被賦值為其他,也可以使用命名函數(shù)表達(dá)式的方法

var factor = (function f (num){

if (num <=1){

return 1;

}else{

return num * f(num-1);

}

});

4.函數(shù)自執(zhí)行

(function (name){

console.log(name);

}('xindi'));

如下實(shí)現(xiàn),這個(gè)匿名函數(shù)會(huì)馬上執(zhí)行

5.閉包

閉包是指能有權(quán)訪問(wèn)另一個(gè)函數(shù)作用域中的變量的函數(shù).

閉包在執(zhí)行的時(shí)候,會(huì)使用arguments和其他的命名參數(shù)創(chuàng)建自己的活動(dòng)對(duì)象,閉包的作用域鏈中會(huì)包含外部函數(shù)的活動(dòng)對(duì)象,當(dāng)在函數(shù)中訪問(wèn)一個(gè)變量時(shí),就會(huì)從其作用域鏈中搜索直到找到為止.所以這就是閉包為什么可以訪問(wèn)其外部函數(shù)的變量.

ps:this對(duì)象和arguments對(duì)象只會(huì)搜索自己的活動(dòng)對(duì)象,不會(huì)去訪問(wèn)外部函數(shù)的活動(dòng)對(duì)象.

但是閉包作用域鏈中保存的是整個(gè)的活動(dòng)對(duì)象,而不是某個(gè)特殊的變量,所以當(dāng)閉包執(zhí)行之后你可能得到的并不是你想要的結(jié)果,例如

function createFunctions (){

var newArr = new Array();

for (var i = 0;i<10;i++) {

newArr[i] = function (){

return i

}

}

return newArr;

}

createFunctions().map(function(item){

let result = item();

console.log(result);

});

這個(gè)例子中item就是閉包,每個(gè)item都都包含了createFunctions的活動(dòng)對(duì)象,但其實(shí)每個(gè)item引用的都是同一個(gè)活動(dòng)對(duì)象.當(dāng)createFunctions執(zhí)行完畢之后createFunctions內(nèi)部的變量I值為10,此時(shí)item(閉包)包含的活動(dòng)對(duì)象中I的值也是10.所以得到的結(jié)果會(huì)都是10;

當(dāng)然我們也可以采用其他的方式來(lái)避免這種情況,如果一定要使用閉包的話,可以采取下面的方式:

function createFunctions (){

var newArr = new Array();

for (var i = 0;i<10;i++) {

newArr[i] = function (num){

return function(){

return num;

}

}(i)

}

return newArr;

}

createFunctions().map(function(item){

let result = item();

console.log(result);

});

這個(gè)方式我們采取自執(zhí)行函數(shù),讓閉包返回的變量i的副本.

在閉包中我們還需要關(guān)注另一個(gè)問(wèn)題就是this對(duì)象和arguments對(duì)象.this和arguments對(duì)象只會(huì)在本身的活動(dòng)對(duì)象去尋找,所以當(dāng)有閉包的時(shí)候,閉包內(nèi)部訪問(wèn)的this和arguments對(duì)象可能不是你想要的.

我們可以有以下幾種解決方案:

1.將this和arguments對(duì)象用另一個(gè)變量保存下來(lái),在閉包內(nèi)部訪問(wèn)你保存的那個(gè)對(duì)象

2.借用bind函數(shù),創(chuàng)建一個(gè)this對(duì)象為你傳入的新函數(shù).

3.借用call 或 apply 改變閉包內(nèi)部的執(zhí)行環(huán)境

6.es5中模仿塊級(jí)作用域的變量,在es6中,實(shí)現(xiàn)let 和const兩個(gè)塊級(jí)作用域的變量,但是在es5中只有var,var聲明的作用域是非塊級(jí)的.不過(guò)我們可以使用閉包來(lái)模仿此行為

(function(){

var i = 0;

}())

如上所示,我們聲明了一個(gè)匿名的自執(zhí)行函數(shù),這樣在這個(gè)函數(shù)內(nèi)部的變量都會(huì)只在此函數(shù)內(nèi)部生效,類似塊級(jí)的變量.

7.私有變量,嚴(yán)格意義上來(lái)說(shuō)在js中并不存在私有變量,但是我們可以通過(guò)不同的方式來(lái)實(shí)現(xiàn)類似私有變量

1.特權(quán)方法:

function Person(){

var priviteVar = 10;

function privateFunc (){

console.log(priviteVar);

return 'lsh';

}

this.publicFunc = function(){

priviteVar += 1;

return privateFunc();

}

}

這樣實(shí)現(xiàn)的結(jié)果就是priviteVar 和privateFunc都只能通過(guò)publicFunc來(lái)訪問(wèn)

2.靜態(tài)私有變量:

(function(){

var priviteVar = 10;

function privateFunc(){

priviteVar += 1;

return 'lsh'+priviteVar;

}

Person = function (name){

this.name = name;

}

Person.prototype.publicFunc = function (){

return privateFunc();

}

}())

上面的實(shí)現(xiàn),構(gòu)造函數(shù)和priviteVar都處于同一個(gè)函數(shù)環(huán)境下,這樣priviteVar就會(huì)成為一個(gè)靜態(tài)變量,也就是你調(diào)用構(gòu)造函數(shù)創(chuàng)建多個(gè)對(duì)象,其仍然共享同一個(gè)priviteVar.

8.模塊模式

有時(shí)候程序中我們會(huì)需要一個(gè)單利對(duì)象來(lái)管理程序的一些信息,同時(shí)這個(gè)單利對(duì)象我們可能需要有它的私有變量,那么我們可以使用模塊模式來(lái)實(shí)現(xiàn)

var single = function (){

var privateVar = 10;

function privateFunc (){

return 'lsh';

}

var obj = new Object();

obj.publicProperty = false;

obj.publicFunc = function (){

privateVar += 1;

return privateFunc();

}

return obj;

}

這樣我們可以得到一個(gè)單利對(duì)象,同時(shí)這個(gè)對(duì)象有自己的私有方法和屬性,也有著公有方法和屬性;

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末俩垃,一起剝皮案震驚了整個(gè)濱河市抽高,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌移国,老刑警劉巖文捶,帶你破解...
    沈念sama閱讀 222,104評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件荷逞,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡粹排,警方通過(guò)查閱死者的電腦和手機(jī)种远,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)顽耳,“玉大人坠敷,你說(shuō)我怎么就攤上這事∩涓唬” “怎么了膝迎?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,697評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)胰耗。 經(jīng)常有香客問(wèn)我限次,道長(zhǎng),這世上最難降的妖魔是什么柴灯? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,836評(píng)論 1 298
  • 正文 為了忘掉前任卖漫,我火速辦了婚禮,結(jié)果婚禮上赠群,老公的妹妹穿的比我還像新娘羊始。我一直安慰自己,他們只是感情好查描,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布突委。 她就那樣靜靜地躺著,像睡著了一般冬三。 火紅的嫁衣襯著肌膚如雪鸯两。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,441評(píng)論 1 310
  • 那天长豁,我揣著相機(jī)與錄音钧唐,去河邊找鬼。 笑死匠襟,一個(gè)胖子當(dāng)著我的面吹牛钝侠,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播酸舍,決...
    沈念sama閱讀 40,992評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼帅韧,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了啃勉?” 一聲冷哼從身側(cè)響起忽舟,我...
    開(kāi)封第一講書(shū)人閱讀 39,899評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后叮阅,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體刁品,經(jīng)...
    沈念sama閱讀 46,457評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評(píng)論 3 341
  • 正文 我和宋清朗相戀三年浩姥,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了挑随。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,664評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡勒叠,死狀恐怖兜挨,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情眯分,我是刑警寧澤拌汇,帶...
    沈念sama閱讀 36,346評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站弊决,受9級(jí)特大地震影響担猛,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜丢氢,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評(píng)論 3 334
  • 文/蒙蒙 一傅联、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧疚察,春花似錦蒸走、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,511評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至岛抄,卻和暖如春别惦,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背夫椭。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,611評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工掸掸, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蹭秋。 一個(gè)月前我還...
    沈念sama閱讀 49,081評(píng)論 3 377
  • 正文 我出身青樓扰付,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親仁讨。 傳聞我的和親對(duì)象是個(gè)殘疾皇子羽莺,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • Lua 5.1 參考手冊(cè) by Roberto Ierusalimschy, Luiz Henrique de F...
    蘇黎九歌閱讀 13,835評(píng)論 0 38
  • 第2章 基本語(yǔ)法 2.1 概述 基本句法和變量 語(yǔ)句 JavaScript程序的執(zhí)行單位為行(line),也就是一...
    悟名先生閱讀 4,151評(píng)論 0 13
  • 繼承 一洞豁、混入式繼承 二盐固、原型繼承 利用原型中的成員可以被和其相關(guān)的對(duì)象共享這一特性荒给,可以實(shí)現(xiàn)繼承,這種實(shí)現(xiàn)繼承的...
    magic_pill閱讀 1,064評(píng)論 0 3
  • 工廠模式類似于現(xiàn)實(shí)生活中的工廠可以產(chǎn)生大量相似的商品刁卜,去做同樣的事情志电,實(shí)現(xiàn)同樣的效果;這時(shí)候需要使用工廠模式。簡(jiǎn)單...
    舟漁行舟閱讀 7,777評(píng)論 2 17
  • 第一種情況: 處理辦法: B通過(guò)Intent啟動(dòng)C后长酗,添加一句代碼:B.this.finish(); Intent...
    底層碼農(nóng)閱讀 752評(píng)論 0 5