jquery全局变量_jQuery源码一个小细节,却很好地体现了性能优化的思想,很优秀...
寫在前面
聽聞大佬們在寫一些框架或者庫的時候,到處都隱藏了一些細節(jié),所以閱讀他們的源代碼,無論從性能優(yōu)化、還是JS API的學(xué)習(xí)、亦或是代碼風(fēng)格等方面給到我們很多啟發(fā)。這兩天我翻看了一下jQuery1.x的源代碼,看到了這么一段,著實讓我覺得很細節(jié),在這兒和大家分享一下。
不再廢話,看代碼
看上圖,整個jquery的初始化做成被包裹在了一個自執(zhí)行函數(shù)中,這很容易理解,因為自執(zhí)行函數(shù)在執(zhí)行時創(chuàng)建了自己的作用域,在jquery中聲明的變量不小心污染全局空間的可能。
但令人疑惑的是,為什么這個自執(zhí)行函數(shù)還會把window回想作為一個函數(shù)參數(shù)傳進來呢?在自執(zhí)行函數(shù)內(nèi)部就能訪問了window呀 ?
從作用域鏈談起
解答上面的問題,其實也不難,這就要提到一個概念: “作用域鏈”。
JS中函數(shù)也是一個對象,函數(shù)擁有可以通過代碼訪問的屬性和一系列僅供js引擎訪問的內(nèi)部屬性。
其中一個內(nèi)部屬性是[[scope]]。該內(nèi)部屬性包含了函數(shù)被創(chuàng)建的作用域中對象的集合,這個集合被稱為函數(shù)的作用域鏈,它決定了哪些數(shù)據(jù)能被函數(shù)訪問 函數(shù)被創(chuàng)建時,它的作用域鏈中會填入一個全局對象,該全局對象包含了所有全局變量。
執(zhí)行函數(shù)時,會創(chuàng)建一個稱為‘運行期上下文’的內(nèi)部對象,運行期上下文定義了函數(shù)執(zhí)行的環(huán)境。每個運行期上下文都有自己的作用域鏈,用于標識符解析。在解析這些標識符時,JS引擎會沿著自己的作用域鏈,逐步地往上查找,找到標識符,則停止。
知道了作用域鏈的查找原理,那么上面的問題也就好回答了:
之所以要把window對象傳入自執(zhí)行函數(shù),是因為jquery源碼中,應(yīng)該存在較多的對window對象的引用,此時就應(yīng)當(dāng)把window對象置于作用域鏈的頭部,這樣就避免了需要window對象時,需要跳過頭部的作用域向上查找,這樣有助于提升性能。
再說說 “with”
相信很多人在面試時都會被問到 “為什么不建議使用 with ?”
在這主要由兩個原因:
OK,上面就是我想給大家分享的內(nèi)容。
過年啦!最后祝各位看到文章的朋友們漲薪漲不停!!!
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的jquery全局变量_jQuery源码一个小细节,却很好地体现了性能优化的思想,很优秀...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 联想第一!2022年全球PC出货量下降1
- 下一篇: 一亿像素!POCO X5 Pro实拍图曝