2016-03-18 7 views
0

誰でもここで何が起こっているのか正確に説明できますか?アンダースコア - > var _ function

_が公開されているため、アンダースコアライブラリのハートビートですが、これは公開されている公開されているものとして_をどのように公開していますか?あなたがコンソールにrootを入力した場合、我々は

var root = this; 

を持って真上

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

しかし.....:

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

私はコンソールに_を入力すると、次が返されますそれはIIFEの範囲内で保護されているのでroot is not definedを返します。これは、最小特権の原則の素晴らしい例のようです。

_が公開されていることはほぼ確実ですが、この機能の説明は理解できます。 objの例は何ですか?アンダースコアメソッドの1つ?

さらに詳細が必要な場合は、ソースとこのセクションは特にfound hereになる可能性があります。これらの行以下

+1

「obj」の例は、ラップされたものです。 '_([1,2,3])。map(...)'の配列です。 – Bergi

+0

@Bergiああ、それはそれをグローバルスコープで利用できるようにする 'new'キーワードですか? –

+0

いいえ、 'new'キーワードはスコープとは関係ありません。任意のコンストラクタのようにインスタンスを構築するだけです。 – Bergi

答えて

2

、いくつかのコードがあります:

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

ブラウザの環境の場合、exportsundefinedになりますので、root.__に設定されます。 rootは先頭にthisに設定され、デフォルト値のthiswindowです。

+0

私はそれをすべて理解していますが、コンソールに 'root'と入力すると何も返されません。 –

+0

その行にブレークポイントを置いてみてください(通常はガターの行番号をクリックしてこれを行うことができます)、コンソールに 'root'と入力してください。 –

+0

@PaulFitzgerald: "* IIFEの範囲内で保護されているので* *" – Bergi

関連する問題