3

我在一个专有网站上工作,我遇到了一些问题。我将 jQuery 和原型一起使用,并且我已经正确地命名了它,所以在这个问题中假设您可以使用 $ 或 jQ 作为对 jQuery 的命名空间引用。

所以我有一堆函数,一些混合了 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 中声明和调用的函数之一说它是未定义的。我将它移到了 document.ready 之外,一切都恢复了。

我基本上是想更好地理解函数如何启动/调用的顺序,所以我的问题是你什么时候在 document.ready 中声明函数,什么时候在外面声明它们?您是否仅在该 document.ready 中调用它们时才在内部声明?或者我应该总是在那个document.ready之外声明它们吗?

谢谢。

4

3 回答 3

4

Generally, you should declare & define your own namespace, where all of your application logic (including functions/methods) is located. That way you avoid collision with other scripts on your site + that way your code is much cleaner and easier to maintenaine.

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);
});

That pattern (some call it the "method pattern") creates a closured function/object which also guarantees private member variables within your namespace, only accessible through the getter functions from the outside.

This is really only a pretty basic example, you can push this idea & pattern to an extend, which is very nice & a good thing (IMO).

A great book about this stuff which was named and recommended pretty often is "Javascript: The Good Parts" by Douglas Crockford.

于 2010-09-01T18:10:31.657 回答
0

(document).ready 更多地用于需要在页面加载时执行的事情,而不是函数声明。如果您在 (document).ready 中声明它们,它们的范围将是该块的本地 - 如果它们仅在本地使用,那很好,它们应该在那里声明。否则,在外面声明它们。

因此,在您的示例中,如果函数仅在该块中使用,则应在其中声明它们。如果额外用于其他地方,则应在外面声明。

于 2010-09-01T18:03:05.060 回答
0

如果一个函数仅在文档就绪函数内部使用,则在内部声明它,以免污染全局范围。否则,在外部声明它,以便脚本的其余部分可以访问这些函数。

于 2010-09-01T18:03:10.570 回答