成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

【JavaScript】window與undefined作為參數(shù)的作用

legendmohe / 1262人閱讀

摘要:比如函數(shù)執(zhí)行作用一函數(shù)內(nèi)部是隔離的區(qū)域函數(shù)執(zhí)行過程中,如果能在參數(shù)處找到那么就不會去全局作用域中找,所以結果就是效率高,提升性能。結論作為實參的用意提高性能方便代碼壓縮。作為形參的用意防止的值被修改早期的低版本瀏覽器中。

本文行文流程

兩個大的信息來源:teacher與segmentfault論壇,以此分為兩大板塊

第一大板塊:一個普通的自調(diào)用函數(shù)==》加了各種參數(shù)的自調(diào)用函數(shù)==》參數(shù)的兩個作用==》類比到jQuery的源代碼封裝==》結論

第二大板塊:論壇的問題==》論壇的被采納的回答==》簡易版的回答,回答中解釋了為什么要加上window,jquery,undefined.

From Teacher

演變歷程

1.原函數(shù)

(function(){
    console.log(1)
})()

2.加window參數(shù)

(function(window){
    console.log(window)
})(window)

此時的window不是全局變量,而是局部變量,雖然去打印的話,出來的效果是一樣的。

形參的位置可以是其他任意字符,反正傳進去的實參是window。
比如:

(function(w){
    console.log(w)
})(window)

3.函數(shù)執(zhí)行-------作用一

(function(window){
    //函數(shù)內(nèi)部是隔離的區(qū)域
    console.log(window)
})(window)

函數(shù)執(zhí)行過程中,如果能在參數(shù)處找到window,那么就不會去全局作用域中找,所以結果就是:效率高,提升性能。(效率高==提升性能,多了一句廢話,但是也有助于理解)

4.代碼壓縮-------作用二

(function(w){
    //函數(shù)內(nèi)部是隔離的區(qū)域
    console.log(w)
})(window)

說明:代碼打包上傳的時候,或者說代碼發(fā)布的時候,也就是網(wǎng)站上線的時候,代碼會被壓縮,此時本來的形參是window,會被壓縮成一個字符w,這樣字符變少了,就節(jié)省了空間。

5.是否可以不添加?自然是可以的

(function(){
    //函數(shù)內(nèi)部是隔離的區(qū)域
    console.log(window)
})()

說明:此時沒有傳window實參,形參也沒有傳,但是內(nèi)部依然可以訪問到window,因為window是全局變量,在哪里都可以訪問到。

注意:此時尋找window去全局作用域中找,所以效率低一些;并且壓縮的時候window不會被壓縮,因為壓縮了瀏覽器就不認識了啊,沒法解析了,所以這樣的參數(shù)就沒法壓縮。

類比到jQuery

jQuery的封裝:jQuery源代碼的最外層就是這樣做的

1.jQuery源代碼的最外層就是這樣做的:傳入window與undefined

(function(window,undefined){
    //函數(shù)內(nèi)部是隔離的區(qū)域
    console.log(window)
})(window)

2.一個事實:早期的瀏覽器中undefined可以修改,新版本瀏覽器不能修改了

    undefined=123;
    console.log(undefined);//結果是123;現(xiàn)在的結果還是undefined

3.jQuery源代碼做法的優(yōu)點:

更嚴謹,不論是什么瀏覽器,里邊的undefined都不會被更改。因為函數(shù)尋找的時候會優(yōu)先找到作為參數(shù)傳過來的undefined,而不會去全局找。

小心得:學任何技術不要局限于怎么用,而要刨根問底的看是怎么實現(xiàn)的。這樣進步會更快。

結論

window作為實參的用意:提高性能;方便代碼壓縮。
undefined作為形參的用意:防止undefined的值被修改(早期的低版本瀏覽器中)。最新的瀏覽器已經(jīng)把這個bug修復了。

From 論壇

問題:像下邊這樣的代碼為什么要把window, jQuery對象傳進去

(function (window, $, undefined) {
    play=function(){
        $("#demo").val("This is a demo.");
    }


    window.wbLogin = play;
})(window, jQuery);
1 論壇被采用的回答

為什么要傳入 jQuery

通過定義一個匿名函數(shù),創(chuàng)建了一個“私有”的命名空間,該命名空間的變量和方法,不會破壞全局的命名空間。這點非常有用也是一個 JS 框架必須支持的功能,jQuery 被應用在成千上萬的 JavaScript 程序中,必須確保 jQuery 創(chuàng)建的變量不能和導入他的程序所使用的變量發(fā)生沖突。

為什么要傳入 window

通過傳入 window 變量,使得 window 由全局變量變?yōu)榫植孔兞?,當?jQuery 代碼塊中訪問 window 時,不需要將作用域鏈回退到頂層作用域,這樣可以更快的訪問 window;這還不是關鍵所在,更重要的是,將 window 作為參數(shù)傳入,可以在壓縮代碼時進行優(yōu)化,看看 jquery-1.6.1.min.js:

(function(a,b){})(window); // window 被優(yōu)化為 a

為什么要傳入 undefined

在自調(diào)用匿名函數(shù)的作用域內(nèi),確保 undefined 是真的未定義。因為 undefined 能夠被重寫,賦予新的值。

undefined = "now it"s defined";
alert( undefined );

瀏覽器測試結果:

瀏覽器 測試結果 結論
ie11 undefined 不能改變
firefox22 undefined 不能改變
chrome31 undefined 不能改變
opera12 undefined 不能改變

2 論壇簡易版本回答

一句話,使全局變量以參數(shù)形式變成自執(zhí)行函數(shù)內(nèi)部的局部變量。

至于為什么這么做,提高程序效率。為什么能提高效率,得從javascript的機制說起,所謂的scope chain作用域鏈,在當前作用域中如果沒有該屬性(局部變量)則向上一層作用域中尋找,一直到最上層,也就是window。也就是說全局變量和下級作用域都是window的一個屬性,向下依此類推。

另外jQuery傳入后將參數(shù)寫成$可以保證在此函數(shù)內(nèi)$為jquery而不是其他類似使用$符號的庫。

undefined同理,由于沒有傳入第三個參數(shù),自然就是undefined。由于javascript中undefined是一個變量,可以被改變,所以這樣可以保證undefined判斷時的準確性。有時判斷時使用typeof xxx === "undefined"也是因為這個原因。

文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉載請注明本文地址:http://m.hztianpu.com/yun/82876.html

相關文章

  • js面試題

    摘要:面試題的基本數(shù)據(jù)類型和引用數(shù)據(jù)類型基本數(shù)據(jù)類型引用數(shù)據(jù)類型和有何區(qū)別表示一個對象被定義了,值為空值表示不存在這個值。 js面試題 JS的基本數(shù)據(jù)類型和引用數(shù)據(jù)類型 基本數(shù)據(jù)類型:undefined、null、boolean、number、string、symbol引用數(shù)據(jù)類型:object、array、function null 和 undefined 有何區(qū)別? null 表示一個對...

    Baoyuan 評論0 收藏0
  • 深入理解javascript原型和閉包

    摘要:情況構造函數(shù)所謂構造函數(shù)就是用來對象的函數(shù)。另外注意,構造函數(shù)的函數(shù)名第一個字母大寫規(guī)則約定。閉包但是你只需要知道應用的兩種情況即可函數(shù)作為返回值,函數(shù)作為參數(shù)傳遞。如上代碼,函數(shù)作為返回值,賦值給變量。這就是需要理解閉包的核心內(nèi)容。 原文鏈接http://www.cnblogs.com/wangfupeng1988/p/3977924.html 對象是屬性的集合。 function ...

    _ang 評論0 收藏0
  • JavaScript中this總結

    摘要:普通函數(shù)調(diào)用函數(shù)在全局作用域下運行在非嚴格模式下,指向全局對象,在嚴格模式下,會變成。使用來調(diào)用函數(shù),或者說發(fā)生構造函數(shù)調(diào)用時,會自動執(zhí)行下面的操作。即構造函數(shù)的指向它實例化出來的對象。 JavaScript中的this實際上是在函數(shù)被調(diào)用時發(fā)生的綁定,它指向什么完全取決于函數(shù)在哪里被調(diào)用。 先來列舉一下都有哪些函數(shù)調(diào)用方式: 普通函數(shù)調(diào)用 對象方法調(diào)用 call()、apply()...

    ghnor 評論0 收藏0
  • JavaScript之變量對象

    摘要:用偽代碼來表示函數(shù)未進入執(zhí)行階段之前,變量對象中的屬性都不能訪問但是進入執(zhí)行階段之后,變量對象轉變?yōu)榱嘶顒訉ο?。全局上下文中,變量對象就是本身。函?shù)上下文中,變量對象包括函數(shù)聲明,變量聲明。 概述 JavaScript 的可執(zhí)行代碼,具有執(zhí)行上下文,而每個上下文包括以下 3 個屬性: 變量對象(variable object, 簡稱 VO) 作用域鏈(scope chain) thi...

    codeGoogle 評論0 收藏0
  • JavaScript學習筆記(一)

    摘要:雖然會輸出,但是這只是存在的一個悠久。在的最初版本中使用的是位系統(tǒng),為了性能考慮使用低位存儲變量的類型信息,開頭代表是對象,然而表示為全零,所以將它錯誤的判斷為。 參考來源: JavaScript高級程序設計:?book.douban.com/subject/105… 千古壹號:?github.com/qianguyihao… 小冊前端面試之道:?juejin.im/book/5bdc71…...

    pingan8787 評論0 收藏0

發(fā)表評論

0條評論

legendmohe

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<