5

これは Chrome のバグと見なされますか、それとも Safari/Firefox の寛大さと見なされますか?

クロージャー関数を作成するときは、任意の名前「ボタン」を付けます。クロージャー内には、クロージャーが作成するメイン オブジェクトのコンストラクターである関数があり、「ボタン」とも呼ばれます。

クロージャーは、おそらく内部関数 Button() への参照を返します。

var closure = (function Button(){

    //the closure's primary object
    function Button(target) {
        //constructor for our button object
    }

    Button.prototype = e.inherit(e.Plugin.prototype);
    Button.prototype.constructor = Button;

    return {
            Button: Button,
        };

}());

//now let's call our closure to create a new Button
var newButton = new closure.Button()

Safari と Firefox では、これは問題になりません。new Closure.Button() を呼び出すと、内側の Button() のインスタンスが返されます。ただし、Chrome では、内部関数名がクロージャー関数名と一致する場合、コンストラクターは呼び出されないように見えます。返されるのはクロージャー関数そのもののようです。もちろん、これは内部関数が後で試して呼び出すメソッドを定義するときにエラーにつながります。

この質問を投稿する理由は 2 つあります。

1) 問題の原因を見つけるのに 1 日以上かかりました。これは、ボタンにメソッド .activate がないことを Chrome が報告していたことです (実際のコードでは、ボタンは .activate() を提供する親オブジェクトから継承されます)。方法)。他の誰かがこの問題に遭遇した場合、彼らはここで私の質問を見つけて、時間を節約できるかもしれません.

2)私は疑問に思っています:これが私の側のエラーである場合、クロージャーとクロージャー内の関数の両方に同じ名前を使用するのに、なぜSafari/Firefoxで機能するのですか? より具体的には、Chrome は意図された内部関数ではなく、何らかの方法でクロージャー自体を返すようにしていますか? これはバグですか?

4

1 に答える 1

1

おそらく正確な問題ではありませんが、関数式に不必要に名前を付けました。

var closure = (function Button(){

    //the closure's primary object
    function Button(target) {
        //constructor for our button object
    }

    Button.prototype = e.inherit(e.Plugin.prototype);
    Button.prototype.constructor = Button;

    return {
            Button: Button,
        };

}());
//now let's call our closure to create a new Button
var newButton = new closure.Button()

する必要があります

var closure = (function (){

    //the closure's primary object
    function Button(target) {
        //constructor for our button object
    }

    Button.prototype = e.inherit(e.Plugin.prototype);
    Button.prototype.constructor = Button;

    return {
            Button: Button
        };

}());

//now let's call our closure to create a new Button
var newButton = new closure.Button();

違いは、最上位の関数に名前がないことです。二度と使わないものに名前を付ける必要はありません。

また、戻りオブジェクト内にカンマを含めないでください。これは、構文エラーとして表示されるはずです。

また、最後の行に終了セミコロンがありません。

于 2012-11-27T17:51:08.847 に答える