2010-09-01 74 views
3

我正在专有网站上工作,并且遇到一些问题。我使用jQuery以及原型,并且我已经正确地使用了名称空间,所以在这个问题中,假设您可以使用$或jQ作为jQuery的名称空间引用。在Javascript中定义函数在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中声明函数,以及何时在外部声明它们?你只在内部声明它们是否只在该文档中被调用?或者我应该总是只在该文档之外声明它们?

谢谢。

回答

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”。

+0

勾结?这是对的,还是你的意思是碰撞? – 2010-09-01 18:28:46

+0

@Daniel:是的,谢谢你的提示。 – jAndy 2010-09-01 18:38:49

+0

我非常喜欢这个,非常有趣。声明/调用函数使用此方法会如何影响性能? – 2010-09-01 18:56:45

0

(document).ready更多地用于需要在页面加载时执行的事情,而不是函数声明。如果你在(document).ready中声明它们,它们的作用域将在该块的本地 - 如果它们只在本地使用,没关系,应该在那里声明它们。否则,在外面宣布它们。

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

+0

所以你只是说当你有很多本地函数在document.ready中使用时,在本地声明。否则,只需全局声明。 – 2010-09-01 18:06:30

+0

如果仅在本地使用,则在本地声明。否则全局声明。对不起,如果我不够清楚。 – 2010-09-01 18:08:15

0

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

+0

关于处理程序怎么样?当您将document.ready内的事件处理程序分配给document.ready中的某个函数时,是否需要在全局范围内或仅在本地范围内声明该事件处理程序? – 2010-09-01 18:05:17

+0

@bryan taylor:在ready内部很好 - 因为事件处理程序存储在该元素的click处理程序列表中,所以当您退出该作用域时,引用不会丢失。 – 2010-09-01 18:22:37