javascript - 在 jQuery 中的 Javascript 中定义函数

标签 javascript jquery javascript-framework

我在专有网站上工作,遇到了一些问题。我将 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 中声明和调用的函数说它是未定义的。我将它移到了 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);
});

该模式(有些人称之为“方法模式”)创建了一个封闭的函数/对象,它还保证您的命名空间内的私有(private)成员变量,只能通过 getter 函数从外部访问。

这实际上只是一个非常基本的示例,您可以将这个想法和模式推向扩展,这非常好,也是一件好事 (IMO)。

Douglas Crockford 的“Javascript:The Good Parts”是一本经常被命名和推荐的关于这方面的好书。

关于javascript - 在 jQuery 中的 Javascript 中定义函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3620822/

相关文章:

javascript - window.opener 不对

javascript - 如何在 JavaScript 中重构 JSON?

javascript - 动态修改现有事件处理程序的值

javascript - Jquery检查数组是否包含子字符串

javascript - 我的RIA应该使用什么建筑模式?

javascript - 使用 requirejs 的句柄 block 辅助函数(在数组的每一行上添加简单的奇偶属性)

javascript - 使用 jQuery 更改选项元素中部分文本的颜色

javascript - 需要将 Chrome 开发工具中的性能监视器详细信息捕获到 Java 程序中

jquery - 如何将 jQuery flot 图表导出为图像?

javascript - 在index.html 中使用编译的JavaScript 代码应该是正确的做法吗?