摘要:比如函數(shù)執(zhí)行作用一函數(shù)內(nèi)部是隔離的區(qū)域函數(shù)執(zhí)行過程中,如果能在參數(shù)處找到那么就不會(huì)去全局作用域中找,所以結(jié)果就是效率高,提升性能。結(jié)論作為實(shí)參的用意提高性能方便代碼壓縮。作為形參的用意防止的值被修改早期的低版本瀏覽器中。
本文行文流程
兩個(gè)大的信息來源:teacher與segmentfault論壇,以此分為兩大板塊
第一大板塊:一個(gè)普通的自調(diào)用函數(shù)==》加了各種參數(shù)的自調(diào)用函數(shù)==》參數(shù)的兩個(gè)作用==》類比到j(luò)Query的源代碼封裝==》結(jié)論
第二大板塊:論壇的問題==》論壇的被采納的回答==》簡(jiǎn)易版的回答,回答中解釋了為什么要加上window,jquery,undefined.
From Teacher演變歷程
1.原函數(shù)
(function(){ console.log(1) })()
2.加window參數(shù)
(function(window){ console.log(window) })(window)
此時(shí)的window不是全局變量,而是局部變量,雖然去打印的話,出來的效果是一樣的。
形參的位置可以是其他任意字符,反正傳進(jìn)去的實(shí)參是window。
比如:
(function(w){ console.log(w) })(window)
3.函數(shù)執(zhí)行-------作用一
(function(window){ //函數(shù)內(nèi)部是隔離的區(qū)域 console.log(window) })(window)
函數(shù)執(zhí)行過程中,如果能在參數(shù)處找到window,那么就不會(huì)去全局作用域中找,所以結(jié)果就是:效率高,提升性能。(效率高==提升性能,多了一句廢話,但是也有助于理解)
4.代碼壓縮-------作用二
(function(w){ //函數(shù)內(nèi)部是隔離的區(qū)域 console.log(w) })(window)
說明:代碼打包上傳的時(shí)候,或者說代碼發(fā)布的時(shí)候,也就是網(wǎng)站上線的時(shí)候,代碼會(huì)被壓縮,此時(shí)本來的形參是window,會(huì)被壓縮成一個(gè)字符w,這樣字符變少了,就節(jié)省了空間。
5.是否可以不添加?自然是可以的
(function(){ //函數(shù)內(nèi)部是隔離的區(qū)域 console.log(window) })()
說明:此時(shí)沒有傳window實(shí)參,形參也沒有傳,但是內(nèi)部依然可以訪問到window,因?yàn)閣indow是全局變量,在哪里都可以訪問到。
注意:此時(shí)尋找window去全局作用域中找,所以效率低一些;并且壓縮的時(shí)候window不會(huì)被壓縮,因?yàn)閴嚎s了瀏覽器就不認(rèn)識(shí)了啊,沒法解析了,所以這樣的參數(shù)就沒法壓縮。
類比到j(luò)Query
jQuery的封裝:jQuery源代碼的最外層就是這樣做的
1.jQuery源代碼的最外層就是這樣做的:傳入window與undefined
(function(window,undefined){ //函數(shù)內(nèi)部是隔離的區(qū)域 console.log(window) })(window)
2.一個(gè)事實(shí):早期的瀏覽器中undefined可以修改,新版本瀏覽器不能修改了
undefined=123; console.log(undefined);//結(jié)果是123;現(xiàn)在的結(jié)果還是undefined
3.jQuery源代碼做法的優(yōu)點(diǎn):
更嚴(yán)謹(jǐn),不論是什么瀏覽器,里邊的undefined都不會(huì)被更改。因?yàn)楹瘮?shù)尋找的時(shí)候會(huì)優(yōu)先找到作為參數(shù)傳過來的undefined,而不會(huì)去全局找。
結(jié)論小心得:學(xué)任何技術(shù)不要局限于怎么用,而要刨根問底的看是怎么實(shí)現(xiàn)的。這樣進(jìn)步會(huì)更快。
window作為實(shí)參的用意:提高性能;方便代碼壓縮。
undefined作為形參的用意:防止undefined的值被修改(早期的低版本瀏覽器中)。最新的瀏覽器已經(jīng)把這個(gè)bug修復(fù)了。
問題:像下邊這樣的代碼為什么要把window, jQuery對(duì)象傳進(jìn)去
(function (window, $, undefined) { play=function(){ $("#demo").val("This is a demo."); } window.wbLogin = play; })(window, jQuery);1 論壇被采用的回答
為什么要傳入 jQuery
通過定義一個(gè)匿名函數(shù),創(chuàng)建了一個(gè)“私有”的命名空間,該命名空間的變量和方法,不會(huì)破壞全局的命名空間。這點(diǎn)非常有用也是一個(gè) JS 框架必須支持的功能,jQuery 被應(yīng)用在成千上萬的 JavaScript 程序中,必須確保 jQuery 創(chuàng)建的變量不能和導(dǎo)入他的程序所使用的變量發(fā)生沖突。
為什么要傳入 window
通過傳入 window 變量,使得 window 由全局變量變?yōu)榫植孔兞浚?dāng)在 jQuery 代碼塊中訪問 window 時(shí),不需要將作用域鏈回退到頂層作用域,這樣可以更快的訪問 window;這還不是關(guān)鍵所在,更重要的是,將 window 作為參數(shù)傳入,可以在壓縮代碼時(shí)進(jìn)行優(yōu)化,看看 jquery-1.6.1.min.js:
(function(a,b){})(window); // window 被優(yōu)化為 a
為什么要傳入 undefined
在自調(diào)用匿名函數(shù)的作用域內(nèi),確保 undefined 是真的未定義。因?yàn)?undefined 能夠被重寫,賦予新的值。
undefined = "now it"s defined";
alert( undefined );
瀏覽器測(cè)試結(jié)果:
瀏覽器 測(cè)試結(jié)果 結(jié)論
ie11 undefined 不能改變
firefox22 undefined 不能改變
chrome31 undefined 不能改變
opera12 undefined 不能改變
一句話,使全局變量以參數(shù)形式變成自執(zhí)行函數(shù)內(nèi)部的局部變量。
至于為什么這么做,提高程序效率。為什么能提高效率,得從javascript的機(jī)制說起,所謂的scope chain作用域鏈,在當(dāng)前作用域中如果沒有該屬性(局部變量)則向上一層作用域中尋找,一直到最上層,也就是window。也就是說全局變量和下級(jí)作用域都是window的一個(gè)屬性,向下依此類推。
另外jQuery傳入后將參數(shù)寫成$可以保證在此函數(shù)內(nèi)$為jquery而不是其他類似使用$符號(hào)的庫(kù)。
undefined同理,由于沒有傳入第三個(gè)參數(shù),自然就是undefined。由于javascript中undefined是一個(gè)變量,可以被改變,所以這樣可以保證undefined判斷時(shí)的準(zhǔn)確性。有時(shí)判斷時(shí)使用typeof xxx === "undefined"也是因?yàn)檫@個(gè)原因。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/82876.html
摘要:面試題的基本數(shù)據(jù)類型和引用數(shù)據(jù)類型基本數(shù)據(jù)類型引用數(shù)據(jù)類型和有何區(qū)別表示一個(gè)對(duì)象被定義了,值為空值表示不存在這個(gè)值。 js面試題 JS的基本數(shù)據(jù)類型和引用數(shù)據(jù)類型 基本數(shù)據(jù)類型:undefined、null、boolean、number、string、symbol引用數(shù)據(jù)類型:object、array、function null 和 undefined 有何區(qū)別? null 表示一個(gè)對(duì)...
摘要:情況構(gòu)造函數(shù)所謂構(gòu)造函數(shù)就是用來對(duì)象的函數(shù)。另外注意,構(gòu)造函數(shù)的函數(shù)名第一個(gè)字母大寫規(guī)則約定。閉包但是你只需要知道應(yīng)用的兩種情況即可函數(shù)作為返回值,函數(shù)作為參數(shù)傳遞。如上代碼,函數(shù)作為返回值,賦值給變量。這就是需要理解閉包的核心內(nèi)容。 原文鏈接http://www.cnblogs.com/wangfupeng1988/p/3977924.html 對(duì)象是屬性的集合。 function ...
摘要:普通函數(shù)調(diào)用函數(shù)在全局作用域下運(yùn)行在非嚴(yán)格模式下,指向全局對(duì)象,在嚴(yán)格模式下,會(huì)變成。使用來調(diào)用函數(shù),或者說發(fā)生構(gòu)造函數(shù)調(diào)用時(shí),會(huì)自動(dòng)執(zhí)行下面的操作。即構(gòu)造函數(shù)的指向它實(shí)例化出來的對(duì)象。 JavaScript中的this實(shí)際上是在函數(shù)被調(diào)用時(shí)發(fā)生的綁定,它指向什么完全取決于函數(shù)在哪里被調(diào)用。 先來列舉一下都有哪些函數(shù)調(diào)用方式: 普通函數(shù)調(diào)用 對(duì)象方法調(diào)用 call()、apply()...
摘要:用偽代碼來表示函數(shù)未進(jìn)入執(zhí)行階段之前,變量對(duì)象中的屬性都不能訪問但是進(jìn)入執(zhí)行階段之后,變量對(duì)象轉(zhuǎn)變?yōu)榱嘶顒?dòng)對(duì)象。全局上下文中,變量對(duì)象就是本身。函數(shù)上下文中,變量對(duì)象包括函數(shù)聲明,變量聲明。 概述 JavaScript 的可執(zhí)行代碼,具有執(zhí)行上下文,而每個(gè)上下文包括以下 3 個(gè)屬性: 變量對(duì)象(variable object, 簡(jiǎn)稱 VO) 作用域鏈(scope chain) thi...
摘要:雖然會(huì)輸出,但是這只是存在的一個(gè)悠久。在的最初版本中使用的是位系統(tǒng),為了性能考慮使用低位存儲(chǔ)變量的類型信息,開頭代表是對(duì)象,然而表示為全零,所以將它錯(cuò)誤的判斷為。 參考來源: JavaScript高級(jí)程序設(shè)計(jì):?book.douban.com/subject/105… 千古壹號(hào):?github.com/qianguyihao… 小冊(cè)前端面試之道:?juejin.im/book/5bdc71…...
閱讀 3859·2023-04-26 00:36
閱讀 2667·2021-11-16 11:44
閱讀 1082·2021-11-15 17:58
閱讀 1665·2021-09-30 09:47
閱讀 1208·2019-08-30 13:05
閱讀 1539·2019-08-30 12:55
閱讀 2409·2019-08-30 11:02
閱讀 2718·2019-08-29 17:01