Re: [問題] (...)()或(...)(window)是什麼意思?

看板Ajax作者 (杉斑加紋)時間13年前 (2012/07/15 06:57), 編輯推噓1(100)
留言1則, 1人參與, 最新討論串5/6 (看更多)
※ 引述《mrbigmouth (拒絕崩潰的蒲公英)》之銘言: : 至於在後方的括號裡丟入window, : 是為了增加讀取的速度。 : 這裡的相關關鍵字叫做Scope Chain。 : 當你使用一個變數時,若javascript在當前環境找不到該名稱的變數, : 就會繼續往外找尋,一直找到最外層的全域物件上還找不到時,才會報錯 : 而大家都知道,目前所有瀏覽器的全域物件都叫window。 : 所有你宣告的廣域函式跟變數都會掛在window下, : 如果你想在上面的self invoking function裡使用任何廣域變數, : javascript就得多經過一次的「找不到的過程」才能找到。 : 但是只要你把window當成參數丟進你的self invoking function裡面, : window就會變成你自製scope裡的區域變數, : 於是就省下了一層查找的功夫。 : 雖然我也很懷疑到底等省下多少功夫啦 : 但多丟參數畢竟只是動幾下手指的事而已。 : 而一些其他的變種 : (function (window, undefined){ : })(window) : 在scope裡宣告了undefined這個變數, : 但是在自我執行時又不丟給他, : 如此便能夠完全確定你在使用undefined時代表的真的是undefined, : (是的,undefined是可以改變值的) : 而這種 : (function ($){ : })(jQuery) : 跟傳window進去的意義是一樣的 : 會這樣使用的人應該是認為他在這個scope裡面使用到的廣域變數只有jQuery一個, : 所以只丟jQuery進去,省去了在scope裡面再次宣告的功夫。 : 另外,jQuery的$縮寫是有可能改變的, : (通常在你同時使用其他以$為縮寫的library時) : 因此這種方法也兼顧了相容性。 我來整理一下傳入參數的用意, 1. 提升速度 區域變數比較快一點點..... 2. 別名 通常是用短名, jQuery 變 $, 雖然window, undefined沒簡短, 但別忘了程式碼壓縮, 像jquery.min.js 3. 包裝, 封裝 相容舊瀏覽器, 怕值被改, 或沙盒效果, 可說是同一件事 在NaN和Infinity早就是時, undefined 在ie5.5才成為一個global variable, 所以要自己定義一個變數, 而它們又都不是保留字, 可以當成自訂的變數名來用,即使是全域, 這等同賦值, ecmascript5不允許改寫, 而新的瀏覽器也開始支援, 以上是怕程式員自己賦值, 而沙盒則是怕運行環境有變, 名稱被改, 像window 要改用unsafeWindow 另外, 像 (function ($){ })(jQuery); 這麼常見,幾乎成為一個規範時, 它本身就有宣示這是一個以 jQuery 寫的...的意義 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 112.104.126.122

07/15 17:54, , 1F
"use strict" 也比較適合包起來,才不會影響到 legacy code
07/15 17:54, 1F
文章代碼(AID): #1G0Vb7-f (Ajax)
文章代碼(AID): #1G0Vb7-f (Ajax)