2016-06-10 47 views
0

我的自我導向的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」永遠不會是窗口?

正當我覺得我已經開始做從古典到原型的語言模式的轉變,我碰到代碼像這樣運行,並將其設置我回來。我真的很感謝一些見解。

回答

1

我看了一下引用的源代碼,這裏更濃縮版本:

var Snap = (function(root) { 
    Snap.version = "0.4.0"; 

    function Snap(w, h) {} 

    var glob = { 
     win: root.window, 
     doc: root.window.document 
    }; 

    ... 

    glob.win.Snap = Snap; 
    return Snap; 
}(window || this)); 

Snap.plugin(...); 

看來,功能捕捉()正在通過glob.win注入到窗口 上下文.Snap分配。我沒有看到頂部的「var Snap」或「返回捕捉」正在做任何事情。

你是正確的,通過return Snap;var Snap = ...;和轉讓的聲明是多餘的,因爲在全球範圍內該變量的生命(即Window對象),並已被glob.win.Snap = Snap;

宣佈我以爲他們只是keept

var MyClass = (function() { 
    function MyClass(n) {} 
    return MyClass; 
})(); 

的第二個問題是:使用類模式的時候,因爲它是VAR聲明是相當多的標準是什麼的「本」後備相提並論ameter請參考 ?我對Snap的理解有限,它總是在 窗口命名空間內使用,所以不會將「this」永遠作爲窗口?

在一些JavaScript環境,根對象不叫window(在node.js中例如global)。無論它被稱爲什麼,window || this都將評估爲根對象。

您會在JavaScript模塊中經常看到這種依賴注入。有關更多信息,請參閱https://carldanley.com/js-module-pattern/

但是,如果由於var glob = { win: root.window, ... }賦值而沒有window對象可用,則該庫似乎不會運行。他們可能只是保留了this,因爲它是標準模塊模式的一部分。