javascript筆記:深入分析javascript裡對象的建立(下)—從對象建立到javascript程式最佳化

來源:互聯網
上載者:User

  為什麼現在主流程式語言裡我們都要建立對象了?下面這個定義我想能給我們一個答案:

  物件導向語言裡對象的定義是:對象是人們要進行研究的任何事物,從最簡單的整數到複雜的飛機等均可看作對象,它不僅能表示具體的事物,還能表示抽象的規則、計劃或事件。拋開這些抽象的定義,從電腦底層技術來理解,對象其實就是一種儲存資料的方式

  寫這個系列下篇著實讓我犯難了,本來我想寫閉包和原型的,但是總覺得不好,在和一位以前同事討論javascript技術時候他告訴我們在電腦語言裡不管是什麼樣的變數其實本質都是資料在電腦的存放方式了,程式就是資料和運算組成的,他說我既然在學習javascript對象的建立,那麼你可以想想建立出的對象究竟是什麼樣的東東,他接著說道,在電腦語言裡你不管在建立什麼比如基礎資料型別 (Elementary Data Type)還是複雜類型的資料,其實說白了都是變數,變數就是程式裡的資料,而程式的運行就是不停的檢索這些資料,建立資料,再檢索資料,迴圈往複,最終資料被持久化的過程,他還說,我經常會問他提高程式效能,最佳化程式的技巧,那麼提高程式裡對資料的檢索能力就是最終極的程式效能最佳化了

  最近研究雅虎的前端技術,才知道這位大牛講的精闢了。

  雅虎的前端技術力說道:

  在javascript裡一共有四種儲存資料的方式(最基本的):

  直接量

  直接量只代表自身,不儲存特定位置。Javascript裡面的直接量有:字串、數字、布爾值、對象、數組、函數。Regex以及特殊的null和undefined。

  變數

  開發人員用關鍵字var定義的資料存放區單元。

  數組元素

  儲存在javascript數組對象內部,以數字為索引。

  對象成員

  儲存在javascript對象內部,以字串為索引。

  牛逼的雅虎前端工程師對這些儲存資料的方式進行了效能測試,在大部分瀏覽器裡讀取直接量和變數的速度遠遠大於讀取數組元素和對象成員。也許我們可以這麼思考對象建立:每建立一個對象我們就增加了資料檢索的複雜度,假如對象裡再嵌套對象,那麼效能損失將是以幾何倍數的增加

  對象的建立或許就是應用響應緩慢夢魘的開始

  我以前說過在javascript也可以借用java裡那句話,:一切皆對象,就連函數也能當做對象。如此說來建立一個函數就是在建立一個對象,而如何建立這個對象是提高程式的效能的關鍵所在。

  在javascript裡建立一個Function對象學問大了,如果我們把函數當做對象,有些難以理解的概念也就好理解多了。

  在中篇裡面我講到了範圍,範圍到底什麼呢?範圍其實是Function對象執行個體的一個內部屬性【Scope】。函數被建立時候【Scope】這個內部屬性包含了這個函數的範圍內所有對象的集合,這個集合叫做範圍鏈,範圍鏈決定了函數能訪問到那些資料

  下面我建立一個函數add,代碼如下:

<script type="text/javascript">
function add(a,b)
{
var sum = a+b;
return sum;
}
</script>

   這是一個非常常見的函數,我們先定義好這個函數,記住先不執行它,當頁面被載入,這個函數也會被初始化,記得前面我講過,這樣定義的函數是屬於window的,載入頁面時候會先行編譯的,這時候函數add的範圍鏈如:

  

  

  當函數add被建立時候,如,add函數裡範圍鏈所包含的對象。(只是部分了)

  為什麼這樣,我這裡還真說不清了,我在firebug裡面在函數add處定義好斷點,大家看如下結果:

  

  這就是函數add的範圍鏈,也就是這個函數可以訪問到的對象集合了。

  這裡只定義了一個函數了,函數只有在運行時候才看到它的本質了。看下面代碼:

 

<script type="text/javascript">
function add(a,b)
{
var sum = a+b;
return sum;
}
add(1,2);
</script>

  當函數被執行的時候,執行函數會建立一個稱為“運行期上下文(execution context)”的內部對象。這就是我在中篇裡講到的執行環境了,不過他是在函數執行時候建立的內部對象了,而絕非是函數一個固有的屬性,只有函數執行時候才會被建立了,一個運行期上下文定義了一個函數執行時的環境。函數每次執行時候對應的運行環境是獨一無二的,所以多次調用同一個函數時候會導致建立多個運行期上下文,當函數執行完畢,執行器上下文就被銷毀了。

  我對運行期內容相關的理解就是函數內部一個匿名的函數,這麼理解的原因是因為建立執行器上下文時候也會建立屬於他的範圍鏈了,因為我認為在javascript裡面只有函數才有範圍鏈這個屬性了,不過這個特別範圍鏈有特殊作用:這個範圍鏈是用來解析標示符的

  我的對象的建立的內容講完了,由對象的建立我引出了範圍和執行環境的概念了,也是對象的建立中的特例函數對象的建立我引入了範圍和執行環境的本質到底是什麼,對象的建立的內容就此結束了,下一篇博文我將通過範圍鏈和執行環境來說說如何寫出高效的javascript程式了。

  好久沒寫部落格了,有朋友說我堅持不去了,當然不是了,最近事情真多,關鍵斷網了20多天了,昨天才好了。我要做技術專家,我想任何技能的提升一定要和大家切磋,所以這個我會堅持下去了,但是真的沒時間我也沒法子了哈。

  喜歡做軟體,就應該當做愛好,不管什麼堅持不堅持,你真喜歡它不用想堅持也能堅持了。

 

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.