我的自我導向的javascript研究終於讓我去閱讀庫,在那裏我找到了下面的代碼片斷(爲簡潔起見而截斷)。我在Windows apache服務器(xampp)上使用Firefox與firebug。這有什麼用途? IIFE賦值給Snap.svg.js中的var
我想下面的代碼片段就足夠了,但如果有人需要它,整個庫可以在這裏找到:snap.svg.js on github
var Snap = (function(root) {
Snap.version = "0.4.0";
function Snap(w, h) { \t // can be either width, height OR
\t if (w) {
\t \t if (w.nodeType) { // deterimines if parameter is a dom element
\t \t \t return wrap(w);
\t \t }
\t \t if (is(w, "array") && Snap.set) { // deterimines if parameter is an array
\t \t \t return Snap.set.apply(Snap, w);
\t \t }
\t \t if (w instanceof Element) { // deterimines if parameter is a Snap.Element
\t \t \t return w;
\t \t }
\t \t if (h == null) { // by elimination determines if parameter is a dom element id.
\t \t \t w = glob.doc.querySelector(String(w));
\t \t \t return wrap(w);
\t \t }
\t }
<numerous public and private properties and methods> \t
.
.
.
glob.win.Snap = Snap;
return Snap;
}(window || this));
螢火蟲顯示在窗口背景下捕捉對象實例化之前任何用戶對象。我想知道到底是什麼機制將Snap對象注入到DOM中。那是當我注意到「var Snap」的時候。起初,我認爲就是這樣。但是,由於當我更改變量名稱或甚至刪除它時沒有中斷應用程序,所以我變得困惑。
進一步的調查導致在iife底部發現......特別是「glob.win.Snap = Snap」。由於「窗口」正在傳遞到生命週期中,看起來這實際上是在窗口中創建Snap對象。將名稱更改爲glob.win.Snappy證實了這一點。
我還在學習,所以請糾正我,如果我錯了。我試圖瞭解這個庫的情況。似乎函數Snap()正通過glob.win.Snap賦值注入窗口上下文。我沒有看到頂部的「var Snap」或「返回Snap」正在做任何事情。事實上,我可以將它們排除在外,一切似乎都正常運行。所以,我的第一個問題:這兩行代碼是否提供了一些我沒有看到的功能?
的第二個問題是:什麼是「本」回退參數是指什麼?我對Snap的有限理解是,它總是在窗口名稱空間內使用,所以「this」永遠不會是窗口?
正當我覺得我已經開始做從古典到原型的語言模式的轉變,我碰到代碼像這樣運行,並將其設置我回來。我真的很感謝一些見解。