亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

從理論角度討論JavaScript閉包

2019-11-19 11:53:53
字體:
來源:轉載
供稿:網友
概論

在討論ECMAScript閉包之前,先來介紹下函數式編程(與ECMA-262-3 標準無關)中一些基本定義。 然而,為了更好的解釋這些定義,這里還是拿ECMAScript來舉例。

眾所周知,在函數式語言中(ECMAScript也支持這種風格),函數即是數據。就比方說,函數可以保存在變量中,可以當參數傳遞給其他函數,還可以當返回值返回等等。 這類函數有特殊的名字和結構。

定義

函數式參數(“Funarg”) ―― 是指值為函數的參數。

如下例子:

function exampleFunc(funArg) { funArg(); } exampleFunc(function () { alert('funArg'); });

上述例子中funArg的實參是一個傳遞給exampleFunc的匿名函數。

反過來,接受函數式參數的函數稱為 高階函數(high-order function 簡稱:HOF)。還可以稱作:函數式函數 或者 偏數理的叫法:操作符函數。 上述例子中,exampleFunc 就是這樣的函數。

此前提到的,函數不僅可以作為參數,還可以作為返回值。這類以函數為返回值的函數稱為 _帶函數值的函數(functions with functional value or function valued functions)。  

(function functionValued() {
        return function () {
            alert('returned function is called');
            };
    })()();//這種()直接執行的方式要熟悉。

可以以正常數據形式存在的函數(比方說:當參數傳遞,接受函數式參數或者以函數值返回)都稱作 第一類函數(一般說第一類對象)。 在ECMAScript中,所有的函數都是第一類對象。

接受自己作為參數的函數,稱為 自應用函數(auto-applicative function 或者 self-applicative function):

(function selfApplicative(funArg) { if (funArg && funArg === selfApplicative) { alert('self-applicative'); return; } selfApplicative(selfApplicative); })();

以自己為返回值的函數稱為 自復制函數(auto-replicative function 或者 self-replicative function)。 通常,“自復制”這個詞用在文學作品中: 

(function selfReplicative() {
        return selfReplicative;
    })(); 

在函數式參數中定義的變量,在“funArg”激活時就能夠訪問了(因為存儲上下文數據的變量對象每次在進入上下文的時候就創建出來了):

function testFn(funArg) { // 激活funArg, 本地變量localVar可訪問 funArg(10); // 20 funArg(20); // 30 } testFn(function (arg) { var localVar = 10; alert(arg + localVar); });

然而,我們知道,在ECMAScript中,函數是可以封裝在父函數中的,并可以使用父函數上下文的變量。 這個特性會引發 funArg問題。

FunArg問題

面向堆棧的編程語言中,函數的本地變量都是保存在堆棧上的, 每當函數激活的時候,這些變量和函數參數都會壓棧到該堆棧上。

當函數返回的時候,這些參數又會從堆棧中移除。這種模型對將函數作為函數式值使用的時候有很大的限制(比方說,作為返回值從父函數中返回)。 絕大部分情況下,問題會出現在當函數有 自由變量的時候。

自由變量是指在函數中使用的,但既不是函數參數也不是函數的局部變量的變量

如下所示:

function testFn() { var localVar = 10; function innerFn(innerParam) { alert(innerParam + localVar); } return innerFn; } var someFn = testFn(); someFn(20); // 30

上述例子中,對于innerFn函數來說,localVar就屬于自由變量。

對于采用 面向堆棧模型來存儲局部變量的系統而言,就意味著當testFn函數調用結束后,其局部變量都會從堆棧中移除。 這樣一來,當從外部對innerFn進行函數調用的時候,就會發生錯誤(因為localVar變量已經不存在了)。

而且,上述例子在 面向堆棧實現模型中,要想將innerFn以返回值返回根本是不可能的。 因為它也是testFn函數的局部變量,也會隨著testFn的返回而移除。

還有一個函數對象問題和當系統采用動態作用域,函數作為函數參數使用的時候有關。

看如下例子:

var z = 10; function foo() { alert(z); } foo(); // 10 亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

亚洲男人天堂久| 精品国产乱码久久久久酒店| 国产精品美女久久久久av超清| 国产精品久久电影观看| 中文在线资源观看视频网站免费不卡| 欧美刺激性大交免费视频| 久久久久国产视频| 国产精品69精品一区二区三区| 精品国产乱码久久久久久天美| 91国内揄拍国内精品对白| 中文字幕国产日韩| 成人欧美一区二区三区黑人| 国产亚洲精品美女久久久久| 亚洲天堂一区二区三区| 97久久伊人激情网| 亚洲第一网站免费视频| 国产亚洲欧洲高清| 992tv在线成人免费观看| 欧美日韩中文字幕在线视频| 国语自产偷拍精品视频偷| 在线日韩精品视频| 成人免费看片视频| 欧美日产国产成人免费图片| 日韩欧美精品免费在线| 国产亚洲欧美视频| 亚洲va欧美va国产综合久久| 中文字幕日韩视频| 97人人模人人爽人人喊中文字| 亚洲精品国产欧美| 2019日本中文字幕| 亚洲跨种族黑人xxx| 亚洲激情视频在线| 欧美成人亚洲成人日韩成人| 97在线观看免费高清| 国产精品香蕉国产| 久久影院资源网| 日韩中文字幕网址| 国产欧美精品va在线观看| 日韩女在线观看| 久久综合伊人77777| 97婷婷涩涩精品一区| 中文字幕亚洲欧美在线| 日韩av在线资源| 久久好看免费视频| 欧美激情啊啊啊| 亚洲欧洲国产精品| 国产日韩欧美电影在线观看| 国产精品免费久久久久影院| 日本精品久久久久久久| 992tv成人免费影院| 国产精品com| 18一19gay欧美视频网站| 久久久久国产精品免费网站| 欧美一区二区.| 亚洲最新av网址| 亚洲v日韩v综合v精品v| 日韩免费av在线| 欧美色videos| 亚洲欧美资源在线| 91精品国产91久久久久久吃药| 日韩国产在线看| 97免费中文视频在线观看| 亚洲国产成人一区| 国产精品久久久久久久久久久久| 亚洲国产91色在线| 亚洲国产日韩欧美在线图片| yw.139尤物在线精品视频| 亚洲欧美日韩爽爽影院| 国产精品成av人在线视午夜片| 中文字幕精品久久久久| 永久免费精品影视网站| 亚洲成人三级在线| 亚洲大胆美女视频| 国产精品久久久一区| 欧美亚洲国产日本| 久久久电影免费观看完整版| 国产精品网站大全| 亚洲自拍偷拍在线| 成人a在线观看| 欧美激情在线播放| 久久九九全国免费精品观看| 国产一区二区三区在线观看网站| 亚洲欧美国产视频| 亚洲第一男人av| 久久成年人免费电影| 欧美一级电影在线| 69久久夜色精品国产69乱青草| 欧美成人午夜影院| 亚洲欧美激情一区| 亚洲精品福利在线观看| 亚洲午夜久久久久久久| 国产成人精品一区二区三区| 国产精品香蕉av| 色狠狠久久aa北条麻妃| 日韩激情av在线免费观看| 深夜福利亚洲导航| 日韩在线免费观看视频| 日韩精品久久久久久久玫瑰园| 亚洲精品视频播放| 亚洲第一黄色网| 久久精品国产成人精品| 中文字幕在线亚洲| 欧美精品一本久久男人的天堂| 亚洲国产精品va在看黑人| 日韩精品视频在线观看免费| 亚洲精品suv精品一区二区| 日韩精品亚洲精品| 国产不卡av在线免费观看| 国产成人精品综合久久久| 亚洲精品资源美女情侣酒店| 色狠狠久久aa北条麻妃| 91在线精品播放| 日韩中文字幕网址| 欧美激情免费观看| 欧美国产日产韩国视频| 久久福利网址导航| 高清一区二区三区日本久| 亚洲欧美一区二区三区情侣bbw| 26uuu亚洲国产精品| 91成人天堂久久成人| 久久精品电影网| 亚洲曰本av电影| 欧美激情小视频| 国产中文日韩欧美| 2019国产精品自在线拍国产不卡| 国产精品男人爽免费视频1| 精品久久久一区二区| 国模gogo一区二区大胆私拍| 亚洲午夜女主播在线直播| 国产欧美一区二区三区久久| 国产99视频精品免视看7| 国产精品成人免费电影| 91精品视频在线播放| 国产精品久久97| 欧美视频一区二区三区…| 国产美女久久久| 奇米四色中文综合久久| 中文字幕在线视频日韩| 欧美韩国理论所午夜片917电影| 国语自产精品视频在线看| 久久久精品国产| 国产99视频精品免视看7| 97精品免费视频| 亚洲丝袜av一区| 在线播放国产一区中文字幕剧情欧美| 精品国产老师黑色丝袜高跟鞋| 精品国产欧美成人夜夜嗨| 九九九久久久久久| 中文欧美在线视频| 久久久久久久久久久久久久久久久久av| 91丝袜美腿美女视频网站| 亚洲成人教育av| 久久国产精品久久久久久久久久| 成人免费视频a| 欧美国产精品va在线观看| 亚洲精品98久久久久久中文字幕| 亚洲第一中文字幕| 日韩精品在线看| 亚洲精选在线观看| 国产高清视频一区三区| 91国产高清在线| 日韩美女av在线免费观看| 国产一区二区三区精品久久久| 国外成人在线播放|