以圖明志

JavaScript

JavaScript閉包其三:閉包的用法

閉包可以創建出非常優雅的設計
實際使用的時候,閉包可以創建出非常優雅的設計,允許對funarg上定義的多種計算方式進行定制。順便提下,函數對象的 apply 和 call方法,在函數式編程中也可以用作應用函數。 這里,我們將它們看作是應用函數 —— 應用到參數中的函數(在apply中是參數列表,在call中是獨立的參數)……

JavaScript

JavaScript閉包其二:閉包的實現

ECMAScript只使用靜態(詞法)作用域
討論完理論部分,接下來讓我們來介紹下ECMAScript中閉包究竟是如何實現的。這里還是有必要再次強調下:ECMAScript只使用靜態(詞法)作用域(而諸如Perl這樣的語言,既可以使用靜態作用域也可以使用動態作用域進行變量聲明)。

JavaScript

JavaScript閉包其一:閉包概論

函數式編程中一些基本定義
前面介紹了作用域鏈和變量對象,現在再講閉包就容易理解了。閉包其實大家都已經談爛了。盡管如此,這里還是要試著從理論角度來討論下閉包,看看ECMAScript中的閉包內部究竟是如何工作的。眾所周知,在函數式語言中(ECMAScript也支持這種風格),函數即是數據。

JavaScript

JavaScript作用域鏈其三:作用域鏈特征

作用域鏈相關的一些重要特征
讓我們看看與作用域鏈和函數[[scope]]屬性相關的一些重要特征。在ECMAScript中,閉包與函數的[[scope]]直接相關,正如我們提到的那樣,[[scope]]在函數創建時被存儲,與函數共存亡。實際上,閉包是函數代碼和其[[scope]]的結合。因此,作為其對象之一,[[Scope]]包括在函數內創建的詞法作用域(父變量對象)。

JavaScript

JavaScript作用域鏈其二:函數的生命周期

分為創建和激活階段
函數的的生命周期分為創建和激活階段(調用時),讓我們詳細研究它。眾所周知,在進入上下文時函數聲明放到變量/活動(VO/AO)對象中。讓我們看看在全局上下文中的變量和函數聲明(這里變量對象是全局對象自身,我們還記得,是吧?)

JavaScript

JavaScript作用域鏈其一:作用域鏈定義

內部上下文所有變量對象的列表
一個執行上下文 的數據(變量、函數聲明和函數的形參)作為屬性存儲在變量對象中。變量對象在每次進入上下文時創建,并填入初始值,值的更新出現在代碼執行階段。這一章專門討論與執行上下文直接相關的更多細節,這次我們將提及一個議題——作用域鏈。如果要簡要的描述并展示其重點,那么作用域鏈大多數與內部函數相關。

JavaScript

JavaScript變量對象其五:__parent__ 屬性

通過這個屬性可以直接引用到活動對象
前面已經提到過,按標準規范,活動對象是不可能被直接訪問到的。但是,一些具體實現并沒有完全遵守這個規定,例如SpiderMonkey和Rhino;的實現中,函數有一個特殊的屬性 __parent__,通過這個屬性可以直接引用到活動對象(或全局變量對象),在此對象里創建了函數。

JavaScript

JavaScript變量對象其四:關于變量

變量只能通過使用var關鍵字才能聲明
通常,各類文章和JavaScript相關的書籍都聲稱:“不管是使用var關鍵字(在全局上下文)還是不使用var關鍵字(在任何地方),都可以聲明一個變量”。請記住,這是錯誤的概念:任何時候,變量只能通過使用var關鍵字才能聲明?!安皇亲兞俊辈⒉皇钦f它不能被改變,而是指它不符合ECMAScript規范中的變量概念。

JavaScript

JavaScript變量對象其三:執行上下文的兩個階段

執行上下文代碼分成兩個階段來處理
現在我們終于到了本文的核心點了。執行上下文的代碼被分成兩個基本的階段來處理:進入執行上下文與執行代碼。變量對象的修改變化與這兩個階段緊密相關。這2個階段的處理是一般行為,和上下文的類型無關(也就是說,在全局上下文和函數上下文中的表現是一樣的)。

JavaScript

JavaScript變量對象其二:VO在不同的執行上下文中

不同執行上下文中的變量對象
對于所有類型的執行上下文來說,變量對象的一些操作(如變量初始化)和行為都是共通的。從這個角度來看,把變量對象作為抽象的基本事物來理解更為容易。同樣在函數上下文中也定義和變量對象相關的額外內容。當訪問全局對象的屬性時通常會忽略掉前綴,這是因為全局對象是不能通過名稱直接訪問的。

JavaScript

JavaScript變量對象其一:VO的聲明

一個與執行上下文相關的特殊對象
如果變量與執行上下文相關,那變量自己應該知道它的數據存儲在哪里,并且知道如何訪問。這種機制稱為變量對象(variable object)。變量對象(縮寫為VO)是一個與執行上下文相關的特殊對象,它存儲著在上下文中聲明的以下內容:變量 (var, 變量聲明);函數聲明 (FunctionDeclaration, 縮寫為FD);函數的形參。

JavaScript

JavaScript函數其四:函數構造器

這種函數的[[Scope]]屬性僅包含全局對象
既然這種函數對象也有自己的特色,我們將它與FD和FE區分開來。其主要特點在于這種函數的[[Scope]]屬性僅包含全局對象。我們看到,函數bar的[[Scope]]屬性不包含foo上下文的Ao——變量”y”不能訪問,變量”x”從全局對象中取得。

JavaScript

JavaScript函數其三:分組中的函數表達式

函數創建后的調用中用圓括號來包住它
讓我們回頭并回答在文章開頭提到的問題——”為何在函數創建后的立即調用中必須用圓括號來包圍它?”,答案就是:表達式句子的限制就是這樣的。按照標準,表達式語句不能以一個大括號{開始是因為他很難與代碼塊區分,同樣,他也不能以函數關鍵字開始,因為很難與函數聲明進行區分。

JavaScript

JavaScript函數其二:函數表達式

它在源碼中總是處在表達式的位置
另外一種可以取代函數聲明的方式是函數表達式,解釋如下:在源碼中須出現在表達式的位置,有可選的名稱,不會影響變量對象,在代碼執行階段創建。這種函數類型的主要特點在于它在源碼中總是處在表達式的位置。

JavaScript

JavaScript函數其一:函數聲明

主要特點在于它們僅僅影響變量對象
下面我們介紹的是一個非常常見的ECMAScript對象——函數(function),我們將詳細講解一下各種類型的函數是如何影響上下文的變量對象以及每個函數的作用域鏈都包含什么,以及回答諸如像下面這樣的問題:下面聲明的函數有什么區別么?(如果有,區別是什么)。

JavaScript

JavaScript探秘:強大的原型和原型鏈

JavaScript繼承模型使用 prototypal 原型模型
JavaScript 不包含傳統的類繼承模型,而是使用 prototypal 原型模型。雖然這經常被當作是 JavaScript 的缺點被提及,其實基于原型的繼承模型比傳統的類繼承還要強大。實現傳統的類繼承模型是很簡單,但是實現 JavaScript 中的原型繼承則要困難的多。
1 / 3 首頁 < Prev 1 2 3 Next > 尾頁 頁碼:
云南快乐十分走势一定牛 中超排名积分榜 辽宁35选7最新开奖结果查询 海南七星彩开奖结果 京东方股票会跌破4元吗 微乐捉鸡麻将如何只赢不输 江苏e球彩半全场 腾讯分分彩走势图分析 天*戏棋牌? 股票大盘下载 永利皇宫开元棋牌