1

外側の var Message と内側の var Message の間の接続は何ですか?

呼び出し

new Message ( element ).display( server_response_text.slice( 6 ) );

物体

var Message = ( function () 
{
    var messages = 
    {
        name:         'Please enter a valid name',
        email:        'Please enter a valid email',
        email_s:      'Please enter a valid email.',
        pass:         'Please enter passoword, 6-40 characters',
        url:          'Please enter a valid url',
        title:        'Please enter a valid title',
        tweet:        'Please enter a valid tweet',
        empty:        'Please complete all fields',
        same:         'Please make emails equal',
        taken:        'Sorry, that email is taken',
        validate:     'Please contact <a class="d" href="mailto:here@host.com">support</a> to reset your password',
    };
    var Message = function (element) 
    {
        this.element = element;
    };
    Message.prototype.display = function( type ) 
    {
        this.element.innerHTML = messages[ type ];
        new Effects().fade( this.element, 'down', 4000 );
    };
    return Message;
} () );

私のライブラリ全体は、このようなモジュールパターンを使用しています

    var NS = ( function ( window, undefined ) 
    {
    /*
    all code here including Message
    */
    } )( window );
4

3 に答える 3

3

これらの変数参照は、名前は同じですが同じです。

無名関数の内部にMessageは、ローカルで宣言されたコンストラクターがあります。
このコンストラクターへの参照は、関数の最後に返されます。

ID のテスト:

window.Message = ( function () {
    ...
    // Defer call
    setTimeout(function() {
        alert('Identity? ' + Message === window.Message);
    }, 100);
    return Message;
} () );

写真:

  • 緑色の オブジェクトMessage(コンストラクター) は、赤色のブロック (関数) 内で定義されます。
  • この関数の最後に、作成された緑色のMessageオブジェクトが返されます。
  • 関数の作成直後に、 を使用して呼び出されます()。戻り値 (緑色のボックス) は、オレンジ色 Messageの変数に渡されます。
  • これで、オレンジ色の変数が 緑色のオブジェクト/コンストラクターMessageを指します。明確にするために:緑とオレンジの変数は同じオブジェクトを参照します MessageMessage
  • このコンストラクターのインスタンスは、newoperatorを使用して作成されます。

于 2012-04-11T21:10:47.803 に答える
1

外側の Message は、即時関数呼び出しの結果に設定されます ("( function ()...")。即時関数の戻り値は内部 Message であり、これも関数に設定されます ("var の直後)。 messages」クローズ スコープ、「var Message = function(element)」関数)。

このコードの外で new Message を呼び出すと、「var Message = function(element)」関数が呼び出されてオブジェクトが構築されます。

この形式を使用する理由は、「メッセージ」をクロージャに保持するためです。基本的に、これはプライベート データです。コメント付きバージョンは次のとおりです。

var Message = ( function ()     // Immediate function call
{
    // This is going to be private data - it's in a closure via the immediate function call
    var messages = 
    {
        name:         'Please enter a valid name',
        email:        'Please enter a valid email',
        email_s:      'Please enter a valid email.',
        pass:         'Please enter passoword, 6-40 characters',
        url:          'Please enter a valid url',
        title:        'Please enter a valid title',
        tweet:        'Please enter a valid tweet',
        empty:        'Please complete all fields',
        same:         'Please make emails equal',
        taken:        'Sorry, that email is taken',
        validate:     'Please contact <a class="d" href="mailto:here@host.com">support</a> to reset your password',
    };

    // This will be returned as the actual value of outer Message
    var Message = function (element) 
    {
        this.element = element;
    };

    // This adds to the prototype so it will be found in all instances of Message objects
    Message.prototype.display = function( type ) 
    {
        this.element.innerHTML = messages[ type ];
        new Effects().fade( this.element, 'down', 4000 );
    };

    // This is the return value of the immediate function call and becomes outer Message
    return Message;
} () );
于 2012-04-11T21:11:35.290 に答える
1

変数名との関係1はまったくありません。

内部で使われている名前です。それもそうかもしれませんfuubar

var fuubar = function (element) 
{
    this.element = element;
};
fuubar.prototype.display = function( type ) 
{
    this.element.innerHTML = messages[ type ];
    new Effects().fade( this.element, 'down', 4000 );
};
return fuubar; // the Object is returned, the Variable (Name) is not

外部名がであることは理にかなっていますMessage。なぜなら、それが他の人に「知られている」からです。1一貫性のために内部名が選択された可能性がありますが、それ以外はセマンティクスには影響しません。

コンストラクターは、 new演算子で呼び出される [設計された] 関数オブジェクトです。変数はオブジェクトに名前を付けることができます。この場合、返されるのは関数オブジェクトであることに注意してください。したがって、関数オブジェクトは外部では名前で認識されますMessage(たとえば、「メッセージに割り当てられます」)。ただし、変数はオブジェクトではありません

したがって、関数オブジェクトに評価する必要new X()がある式Xを評価し、それをコンストラクターとして使用します。(コンストラクターは、で使用されることを期待する単なる通常の関数ですnew。初期化を実行し、[[prototype]] を確立することができます)。関数オブジェクトに評価される必要がある場合を除いて、名前X重要ではありません。次の同等の形式を考えてみましょう: new (X)(). 式が最初(X)に評価されます。

それでは、コードを分解しましょう。

var Message = (function () {
   // This function is invoked immediately, due to the
   // parenthesis immediately after the FunctionExpression.
   // As noted above the name Message used inside is not important.
   // What *IS* important is that a Constructor, which is just
   // a function-object (which is just an object) is returned.
   // This returned object will be assigned to (the outer)
   // Message variable. That is, it is "named by Message"
   // after the assignment occurs.
})()

// At this point Message will evaluate to a function-object
// (a Constructor in particular).
Message instanceof Function // -> true

// And we can use it to create new messages:
var messageA = new Message("a")
var messageB = new Message("b")

ハッピーコーディング。

于 2012-04-11T21:12:21.137 に答える