0

この場合、DropHandler というオブジェクトを定義します。

function DropHandler(){}
DropHandler.prototype={
    AllowDrop : AllowDrop,
    Drag : Drag,
    Drop : Drop
}

Admin オブジェクトに DropHandler のインスタンスを作成したいのですが、次のコードの違いは何ですか? コード (2) はこの場合使用できないようで、未定義の型エラーが発生します

var BackendAdmin = function(){
    this.DropHandler = new DropHandler();//(1);
    var DropHandler = new DropHandler();//(2);
}
4

2 に答える 2

3

違いは、(1) では新しいDropHandlerオブジェクトをインスタンスDropHandlerのプロパティに割り当てBackendAdmin、(2) ではそれをローカルDropHandler変数に割り当てることです。

は、インタープリターによってメソッドの先頭に自動的に移動され ( Hoistingvarと呼ばれます)、実際のコードは次のようになるため、エラーが発生します。

var BackendAdmin = function(){
    var DropHandler;
    this.DropHandler = new DropHandler();//(1);
    DropHandler = new DropHandler();//(2);
}

したがって、実際には空の変数によって上書きされる関数を呼び出そうとします。

PS: JS 変数の巻き上げの本当に良い説明を見つけることができませんが、これは google からのものです: http://blog.binarymist.net/2011/11/14/scoping-hoisting-in-javascript/

于 2012-07-25T03:50:34.987 に答える
1

同じ名前の 2 つの別個のエンティティ (ローカル変数とスコープ内の関数) を持つことはできず、それらを別々に到達可能なエンティティにすることはできません。

ローカル変数を作成すると、そのスコープ内の同じ名前の関数が一時的にオーバーライド/非表示になり、その関数名はそのスコープ内でアクセスできなくなります。いずれかの名前を変更すると、次のように機能するはずです。

var BackendAdmin = function(){
    this.DropHandler = new DropHandler();//(1);
    var myDropHandler = new DropHandler();//(2);
}

this.DropHandlerその場合DropHandlerは別のオブジェクトのプロパティであり、関数とは別であるためDropHandler()機能します。

于 2012-07-25T03:51:38.687 に答える