在 jQuery 中用 Javascript 定义函数

Posted

技术标签:

【中文标题】在 jQuery 中用 Javascript 定义函数【英文标题】:Defining Functions In Javascript Within jQuery 【发布时间】:2011-04-06 22:56:40 【问题描述】:

我正在开发一个专有网站,但遇到了一些问题。我将 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 之外声明它们?

谢谢。

【问题讨论】:

【参考方案1】:

通常,您应该声明和定义自己的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》是一本关于这些东西的好书,经常被命名和推荐。

【讨论】:

我很喜欢这个,很有趣。使用此方法声明/调用函数对性能有何影响? @bryan.taylor:性能与从全局(窗口)命名空间调用这些函数一样好。由于我们正在执行对象查找并扩展范围链,因此它可能会稍微慢一些,但这种差异就像什么都没有,真的应该不会阻止任何人这样做或类似。【参考方案2】:

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

所以在你的例子中,如果函数只在那个块中使用,它们应该在那里声明。如果它们还用于其他地方,则应在外面声明。

【讨论】:

所以你说只有在 document.ready 中使用了很多本地函数时才在本地声明。否则只需全局声明。 如果仅在本地使用,请在本地声明。否则全局声明。对不起,如果我不够清楚。【参考方案3】:

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

【讨论】:

处理程序怎么样?当您将 document.ready 内的事件处理程序分配给 document.ready 内的函数时,您需要在全局范围内声明还是仅在本地范围内声明? @bryan taylor:内部准备好了 - 因为事件处理程序存储在该元素的单击处理程序列表中,所以当您退出该范围时引用不会丢失。

以上是关于在 jQuery 中用 Javascript 定义函数的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript 里,$ 代表什么?/JQuery是什么语言?/html中用link标签引入css时的中 rel="stylesheet"属性?/EL表达式是什么?

javaScript和jQuery自动加载方法

javaScript中用eval()方法转换json对象

JavaScript&jQuery.HTML5事件

jquery自定义组件开发

jQuery使用总结