3

私は独自のサイトで作業していますが、いくつか問題があります。私はプロトタイプと一緒にjQueryを使用しており、名前空間が適切に設定されているため、この質問では、jQueryへの名前空間参照として $ または jQ を使用できると想定しています。

だから私はたくさんの関数を持っています。いくつかはjQueryとjavascriptを混ぜたもの、いくつかは単純なjavascript、いくつかはjQueryのみです。現在、いくつかの関数は document.ready jQuery 関数内で定義されており、一部はその外部で定義されています。次のようなものです。

jQ(document.ready(function($) {

  if ( ifConfig ) {
    //page check, function calls here
    fnc1();
    fnc2();
    fnc3();
    fnc4();
  }

  function fnc1() {
    //fnc code in here
  }
  function fnc2() {
    //fnc code in here
  }
});  //end document.ready

function fnc3() {
}
function fnc4() {
}

これはすべて疑似コードです。関数が有効で、有効なコードが含まれていると想定できます。最近、デバッグを行っていましたが、document.ready 内で宣言および呼び出された関数の 1 つが未定義であると言いました。document.ready の外に移動したところ、すべてが再び機能しました。

私は基本的に、関数がどのように開始/呼び出されるかの順序を理解しようとしています. それらがその document.ready only 内で呼び出されたときにのみ内部で宣言しますか? それとも、常にその document.ready の外でそれらを宣言する必要がありますか?

ありがとう。

4

3 に答える 3

4

namespace一般に、すべてのアプリケーション ロジック (関数/メソッドを含む) が配置されている独自の を宣言および定義する必要があります。そうすれば、サイト上の他のスクリプトを回避できcollisionます + そうすれば、コードがよりクリーンになり、保守が容易になります。

var myapp = function(){
    var foobar1 = null,
        foobar2 = null,
        foobar3 = null;

    return {
        getFoobar1:  function(){
           return foobar1;
        },
        getFoobar2:  function(){
           return foobar2;
        },
        setFoobar1:  function(foo){
           foobar1 = foo;
        },
        clickhandler: function(e){
           alert('I am an event handler, and I am not anonymous');
        }
        // etc.
    };
};

$(document).ready(function(){
    var Application = myapp();

    Application.getFoobar2();

    $(document).bind('click', Application.clickhandler);
});

そのパターン (「メソッド パターン」と呼ぶ人もいます) は、名前空間内のプライベート メンバー変数も保証するクロージャ関数/オブジェクトを作成getterし、外部から関数を介してのみアクセスできます。

これは本当に非常に基本的な例にすぎません。このアイデアとパターンを拡張することができます。これは非常に素晴らしく、良いことです (IMO)。

Douglas Crockford 著の「Javascript: The Good Parts」という名前が付けられ、推奨されることの多い、この内容に関する優れた本があります。

于 2010-09-01T18:10:31.657 に答える
0

(document).ready は、関数宣言ではなく、ページの読み込み時に実行する必要があるものに使用されます。(document).ready 内で宣言すると、そのスコープはそのブロックに対してローカルになります。ローカルでのみ使用する場合は問題なく、そこで宣言する必要があります。それ以外の場合は、外部で宣言してください。

したがって、あなたの例では、関数がそのブロックでのみ使用されている場合は、そこで宣言する必要があります。さらに他の場所で使用される場合は、外部で宣言する必要があります。

于 2010-09-01T18:03:05.060 に答える
0

関数がドキュメント準備完了関数内でのみ使用される場合は、内部で宣言して、グローバル スコープを汚染しないようにします。それ以外の場合は、外部で宣言して、スクリプトの残りの部分がそれらの関数にアクセスできるようにします。

于 2010-09-01T18:03:10.570 に答える