2013-07-15 67 views
3

這是從annotated source of _.js開始。儘管我可以嘗試,但我的JavaScript能力還不夠高,無法理解這裏發生了什麼。我希望有人能給出一個真實的一步一步的解釋。我真的從字面上不知道以下代碼除了以某種方式設置_以供使用,儘管我理解每個單獨的表達式。瞭解_.js中下劃線的聲明?

var _ = function(obj) { 
    if (obj instanceof _) return obj; 
    if (!(this instanceof _)) return new _(obj); 
    this._wrapped = obj; 
    }; 

    if (typeof exports !== 'undefined') { 
    if (typeof module !== 'undefined' && module.exports) { 
     exports = module.exports = _; 
    } 
    exports._ = _; 
    } else { 
    root._ = _; 
    } 
+0

我的問題,爲什麼它重要的是什麼? – Shawn31313

+4

....試圖學習和理解高級編碼技術? – Aerovistae

+0

好吧,夠公平的。首先,你需要知道'instanceof'的作用。 'instanceof'運算符測試對象是否在其原型鏈中具有構造函數的原型屬性。關於它的更多信息,請訪問:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/instanceof – Shawn31313

回答

9
var _ = function(obj) { 
    // Either serve as the identity function on `_` instances, 
    // ... or instantiate a new `_` object for other input. 

    // If an `_` instance was passed, return it. 
    if (obj instanceof _) return obj; 
    // If someone called `_(...)`, rather than `new _(...)`, 
    // ... return `new _(...)` to instantiate an instance. 
    if (!(this instanceof _)) return new _(obj); 

    // If we are instantiating a new `_` object with an underlying, 
    // ... object, set that object to the `_wrapped` property. 
    this._wrapped = obj; 
}; 

// If there is an exports value (for modularity)... 
if (typeof exports !== 'undefined') { 
    // If we're in Node.js with module.exports... 
    if (typeof module !== 'undefined' && module.exports) { 
     // Set the export to `_` 
     exports = module.exports = _; 
    } 
    // Export `_` as `_` 
    exports._ = _; 
} else { 
    // Otherwise, set `_` on the global object, as set at the beginning 
    // ... via `(function(){ var root = this; /* ... */ }())` 
    root._ = _; 
} 
+0

Afaik'根'是全球範圍。 – Bergi

+0

@Bergi謝謝,不熟悉下劃線的來源。 – matt3141

3

好了,下段是相當無關。基本上它是從關閉出口_到全球範圍,或者使用module definition system(如果有的話)。沒有什麼大不了的,如果你不使用模塊,沒有什麼可以關心的。

_函數不應該那麼難理解。你需要知道

所以它做什麼:

  1. 如果參數是一個下劃線情況下,原樣返回。
  2. 如果函數不稱爲構造函數(當this上下文不是一個下劃線實例),那麼這樣做並返回
  3. 否則包裹的說法在目前的情況下
+0

有時我希望SO有合併答案的選項。 – Aerovistae

+0

有維基答案......但爲什麼,這樣你可以upvote他們兩個呢? :-) – Bergi