在jQuery中用Javascript定义函数

在jQuery中用Javascript定义函数,javascript,jquery,javascript-framework,Javascript,Jquery,Javascript Framework,我在一个专有网站上工作,我遇到了一些问题。我将jQuery与prototype一起使用,并且我已经对它进行了正确的名称空间设置,因此在这个问题中,假设您可以使用$或jQ作为jQuery的名称空间引用 所以我有很多函数,一些混合了jQuery和javascript,一些普通javascript,一些只包含jQuery。现在,有些函数是在document.ready jQuery函数中定义的,有些是在它之外定义的,有点像这样: jQ(document.ready(function($) { i

我在一个专有网站上工作,我遇到了一些问题。我将jQuery与prototype一起使用,并且我已经对它进行了正确的名称空间设置,因此在这个问题中,假设您可以使用$或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中声明和调用的函数说它没有定义。我把它移到了文档之外。准备好了,一切又恢复了

我基本上是想更好地理解函数如何启动/调用的顺序,所以我的问题是什么时候在文档中声明函数。准备好了吗?什么时候在文档外部声明函数?您是否仅在该文档中调用它们时才声明内部。仅准备就绪?或者我应该总是在文档之外声明它们。准备好了吗

谢谢。

(文档)。ready更多用于页面加载时需要执行的操作,而不是函数声明。如果您在(document.ready)中声明它们,它们的作用域将是该块的本地范围-如果它们仅在本地使用,则可以,它们应该在那里声明。否则,请在外面申报


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

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

通常,您应该声明并定义自己的
命名空间,所有应用程序逻辑(包括函数/方法)都位于该命名空间中。这样可以避免与站点上的其他脚本发生
冲突
,而且代码更干净,更易于维护

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》(Javascript:The Good Parts)是一本关于这类东西的好书,它经常被命名和推荐。

关于处理程序呢?将document.ready内的事件处理程序分配给document.ready内的函数时,你需要在全局范围内声明还是只在局部范围内声明?@bryan taylor:在就绪范围内是可以的——因为事件处理程序存储在该元素的单击处理程序列表中,所以退出该范围时引用不会丢失。所以你说的是,当document.ready中使用了大量局部函数时,只在局部声明。否则只需全局声明。如果它们仅在本地使用,则在本地声明。否则,全局声明。对不起,如果我不够清楚的话。我很喜欢这个,它很有趣。使用此方法声明/调用函数如何影响性能?@bryan.taylor:性能与从全局(窗口)命名空间调用这些函数一样好。它可能会稍微慢一点,因为我们正在进行对象查找并扩展范围链,但这种差异就像什么都没有,实际上应该不会阻止任何人这样做或类似的事情。