立即執(zhí)行函數(shù)蚊伞、函數(shù)作用域鏈、閉包

函數(shù)表達(dá)式
var fn = function(){
var a = 1
console.log(a)
};
fn()
1
undefined
立即執(zhí)行函數(shù)
function(){
var a = 1
console.log(a)
}()
Uncaught SyntaxError

會(huì)出現(xiàn)語(yǔ)法錯(cuò)誤的提示
javascript提供的執(zhí)行函數(shù)的語(yǔ)法

(function(){
var a = 1
console.log(a)
}())
1
undefined

函數(shù)會(huì)直接執(zhí)行吮铭,打出1
語(yǔ)句的返回值為undefined
除此之外时迫,還有其它的使用立即執(zhí)行函數(shù)的語(yǔ)法

(function(){
var a = 1
console.log(a)
})()
1
undefined

直接在函數(shù)添加前綴‘+’或‘-’
會(huì)在控制臺(tái)打出

1
NaN

前綴為‘~’

 1
-1

前綴為‘!’

1
true

如果函數(shù)不是從第一行開(kāi)始,可能會(huì)出現(xiàn)錯(cuò)誤

var a = 2
(function(){
var a = 1
console.log(a)
})()

會(huì)出現(xiàn)未知錯(cuò)誤
上面提到的立即執(zhí)行函數(shù)
只有在函數(shù)前面添加前綴‘~’或‘!’
不會(huì)出現(xiàn)錯(cuò)誤

var a = 2
!function(){
var a = 1
console.log(a)
}()
1
true
按值傳遞和地址傳遞
image.png
!function outer(){
    var outerA = 1
    function inner(){
        var innerA = 1
        setInterval(function(){
            innerA = innerA + 1
            console.log("innerA的值是:" + innerA)
        },1000)

        var temp   = {
            ref:innerA //2
        }
        return temp
    }
    var tempRef = inner()
    setInterval(function(){
        console.log(tempRef)
    },1000)
}()
innerA的值是:2
 {ref: "2"}
 innerA的值是:3
 {ref: "2"}
. . . . . . . . . . . . . .//一秒打出一次

innerA是按值傳遞的沐兵。
上例中,可以看出在inner函數(shù)里的innerA便监,值是一直變化的
但是在執(zhí)行了inner函數(shù)之后返回的包含innerA的對(duì)象里
innerA的值卻是不變的扎谎。
因?yàn)閠empRef是只執(zhí)行了一次inner函數(shù)返回的值,
執(zhí)行時(shí)烧董,innerA的值是‘1’毁靶,
之后innerA的值再變化就和tempRef沒(méi)有關(guān)系了,

!function outer(){
    var outerA = 1
    function inner(){
        var innerA = {name:1}
        setInterval(function(){
            innerA.name = innerA.name + 1
            console.log("innerA的值是:" + innerA.name)
        },1000)

        var temp   = {
            ref:innerA //2
        }
        return temp
    }
    var tempRef = inner()
    setInterval(function(){
        console.log(JSON.stringify(tempRef))
    },1000)
}()
innerA的值是:2
{"ref":{"name":2}}
innerA的值是:3
{"ref":{"name":3}}
. . . . . . . . . . . . . .//一秒打出一次

因?yàn)閕nnerA是按地址傳遞的

函數(shù)作用域鏈

這里簡(jiǎn)單介紹一下作用域
當(dāng)函數(shù)被調(diào)用時(shí)逊移,
會(huì)創(chuàng)建一個(gè)執(zhí)行環(huán)境以及相應(yīng)的作用域鏈预吆。
在作用域鏈中,
函數(shù)內(nèi)的arguments和其它命名參數(shù)作為初始化函數(shù)的活動(dòng)對(duì)象胳泉,處于第一位拐叉。
外部函數(shù)的活動(dòng)對(duì)象處于第二位,
外部函數(shù)的外部函數(shù)的活動(dòng)對(duì)象處于第三位扇商,
直到作用域鏈重點(diǎn)的全局執(zhí)行環(huán)境凤瘦。
compare()函數(shù)為例

function compare(value1,value2){
    if(value1<value2){
      return -1;
    } else if(value1>value2){
      return 1;
    } else {
      return 0;
    }
}
var result = compare(5,10)

執(zhí)行compare()時(shí),
compare函數(shù)內(nèi)會(huì)創(chuàng)建一個(gè)包含arguments數(shù)組案铺、value1變量蔬芥、value2變量的活動(dòng)對(duì)象。
因?yàn)槭窃谌肿饔糜蛑袌?zhí)行了函數(shù),
在全局作用域內(nèi)會(huì)創(chuàng)建一個(gè)包含result變量笔诵、compare函數(shù)的全局變量對(duì)象返吻。

常見(jiàn)函數(shù)的作用域鏈.png

在函數(shù)執(zhí)行之后,做產(chǎn)生一個(gè)作用域鏈乎婿,分別是全局作用域以及局部作用域测僵,在全局作用域里可獲取全局變量對(duì)象compare和result,在局部作用域里可獲取compare函數(shù)里的局部活動(dòng)變量對(duì)象arguments,value1,value2

什么是變量對(duì)象

后臺(tái)的每個(gè)執(zhí)行環(huán)境都有一個(gè)表示變量的對(duì)象——變量對(duì)象次酌。
全局環(huán)境的變量對(duì)象始終存在恨课,
函數(shù)的局部環(huán)境的變量對(duì)象只在執(zhí)行的過(guò)程中存在,執(zhí)行完之后就銷毀了岳服。
在創(chuàng)建compare()函數(shù)時(shí)剂公,
會(huì)創(chuàng)建一個(gè)預(yù)先包含全局變量對(duì)象的作用域鏈,在這個(gè)作用域鏈被保存在內(nèi)部的[[Scope]]屬性中吊宋。
調(diào)用函數(shù)時(shí)纲辽,
會(huì)為函數(shù)創(chuàng)建一個(gè)執(zhí)行環(huán)境,然后復(fù)制內(nèi)部屬性中的對(duì)象構(gòu)建執(zhí)行環(huán)境的作用域鏈璃搜。
同時(shí)拖吼,
有一個(gè)活動(dòng)對(duì)象被創(chuàng)建并推入執(zhí)行環(huán)境作用域鏈的前端。
這個(gè)作用域鏈中包含兩個(gè)變量對(duì)象:
本地活動(dòng)對(duì)象和全局變量對(duì)象这吻。
作用域鏈本質(zhì):
指向變量對(duì)象的指針列表吊档,只包含指針地址來(lái)對(duì)變量對(duì)象的引用。
函數(shù)內(nèi)的內(nèi)部函數(shù)會(huì)將它的外部函數(shù)的活動(dòng)對(duì)象添加進(jìn)它的作用域鏈唾糯。

探索閉包

閉包是指有權(quán)訪問(wèn)另一個(gè)函數(shù)作用域中的變量的函數(shù)
創(chuàng)建閉包的常見(jiàn)方式怠硼,
就是在一個(gè)函數(shù)內(nèi)部創(chuàng)建另一個(gè)函數(shù),

function createComparisonFunction(propertyName){
  return function(object1,object2){
    var value1 = object1[property];
    var value2 = object2[property];
    
    if(value1<value2){
      return -1;
    } else if(value1>value2){
      return 1;
    } else {
      return 0;
    }

  }
}

執(zhí)行函數(shù)

var compare = createComparisonFunction("name");
//創(chuàng)建函數(shù)
var result = compare({name:"Jack"},{name:"Rose"});
//調(diào)用函數(shù)
compareNames = null
//解除對(duì)匿名函數(shù)的引用(以便釋放內(nèi)存)
閉包的作用域鏈.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末移怯,一起剝皮案震驚了整個(gè)濱河市香璃,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌舟误,老刑警劉巖葡秒,帶你破解...
    沈念sama閱讀 211,423評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異嵌溢,居然都是意外死亡眯牧,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,147評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門(mén)赖草,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)炸站,“玉大人,你說(shuō)我怎么就攤上這事疚顷『狄祝” “怎么了禁偎?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,019評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)阀坏。 經(jīng)常有香客問(wèn)我如暖,道長(zhǎng),這世上最難降的妖魔是什么忌堂? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,443評(píng)論 1 283
  • 正文 為了忘掉前任盒至,我火速辦了婚禮,結(jié)果婚禮上士修,老公的妹妹穿的比我還像新娘枷遂。我一直安慰自己,他們只是感情好棋嘲,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,535評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布酒唉。 她就那樣靜靜地躺著,像睡著了一般沸移。 火紅的嫁衣襯著肌膚如雪痪伦。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,798評(píng)論 1 290
  • 那天雹锣,我揣著相機(jī)與錄音网沾,去河邊找鬼。 笑死蕊爵,一個(gè)胖子當(dāng)著我的面吹牛辉哥,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播攒射,決...
    沈念sama閱讀 38,941評(píng)論 3 407
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼醋旦,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了匆篓?” 一聲冷哼從身側(cè)響起浑度,我...
    開(kāi)封第一講書(shū)人閱讀 37,704評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤寇窑,失蹤者是張志新(化名)和其女友劉穎鸦概,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體甩骏,經(jīng)...
    沈念sama閱讀 44,152評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡窗市,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,494評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了饮笛。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片咨察。...
    茶點(diǎn)故事閱讀 38,629評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖福青,靈堂內(nèi)的尸體忽然破棺而出摄狱,到底是詐尸還是另有隱情脓诡,我是刑警寧澤,帶...
    沈念sama閱讀 34,295評(píng)論 4 329
  • 正文 年R本政府宣布媒役,位于F島的核電站祝谚,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏酣衷。R本人自食惡果不足惜交惯,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,901評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望穿仪。 院中可真熱鬧席爽,春花似錦、人聲如沸啊片。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,742評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)钠龙。三九已至炬藤,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間碴里,已是汗流浹背沈矿。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,978評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留咬腋,地道東北人羹膳。 一個(gè)月前我還...
    沈念sama閱讀 46,333評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像根竿,于是被迫代替她去往敵國(guó)和親陵像。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,499評(píng)論 2 348

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