2016-03-23 3 views
0

私はあなたがそれをJavaScriptで生命維持だとわかりますhereキーワード

からのサンプルコードを読んメートル。いくつかの文書を読んだ後、私はそれが何であるか、そしてそれがどのように単純な方法でうまくいくのかをよく理解しています。

var access = routingConfig.userRoles; 

しかし、このスクリプトの最後で、それは「この[ 『routingConfig』]」

(function(exports){ 

    // Other codes 
    exports.userRoles = buildRoles(config.roles); 
    // Other codes and definition of buildRoles 

})(typeof exports === 'undefined' ? this['routingConfig'] = {} : exports); 

を渡しそして、我々が他のスクリプトファイルに次のようにそれを直接呼び出すことができているようです

だからこの「キーワードを追加し、グローバル名前空間として機能しているようです

(typeof exports === 'undefined' ? this['routingConfig'] = {} : exports); 

の正確な用法何R」 outingConfig 'をキーと値のペアとして使用します。

+0

コンソールを開いて 'this'と打ち込むと、グローバルなウィンドウが表示されます。 – dannyjolie

答えて

4

このコード行:

(typeof exports === 'undefined' ? this['routingConfig'] = {} : exports); 

は、最終的には生命維持の最初の引数として渡すかを決定する予定です。 exportsは、現在のスコープで定義されている場合

  1. 、それはexportsを通過します。
  2. exportsが定義されていない場合は、this['routingConfig']を空のオブジェクトに初期化し、空のオブジェクトを最初の引数として渡します。

routingConfig.userRolesがアクセス可能で他の場所のコードである場合this['routingConfig']は、いくつかのオブジェクトのプロパティを設定している(このコードでのどんなthis点)と、そのオブジェクトが他の場所であなたのコードで明らかにアクセス可能であるので、それはです。

thisglobalオブジェクトを指している可能性がありますが、わかりやすく知るにはコードの全体のコンテキストを参照する必要があります。グローバルオブジェクトを指す場合は、コード内の他の場所からアクセスできる理由を説明できます。個人的に


、私はthisがグローバルオブジェクトであると仮定したコードを書くことはありません。グローバルオブジェクトを参照したい場合、私はそれを直接参照します。コードを見ている人は、thisに設定されていることを不思議に思うことなく、コードが意図していることを正確に知ることができます。

thisの私の使用は、ほとんどがメソッド呼び出しのホストオブジェクトか、DOMイベントの場合は.addEventListener()のようなコールバック関数が呼び出されたときにドキュメントを介して設定されたものです。これにより、ローカルのコード・コンテキストから、thisが設定されていることがはっきりと分かります。