Re: [問題] (...)()或(...)(window)是什麼意思?
※ 引述《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
07/15 17:54, 1F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 5 之 6 篇):
Ajax 近期熱門文章
PTT數位生活區 即時熱門文章