Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/422.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用apply方法调用jQuery document.ready处理程序?_Javascript_Jquery_Anonymous Function_Document Ready - Fatal编程技术网

Javascript 使用apply方法调用jQuery document.ready处理程序?

Javascript 使用apply方法调用jQuery document.ready处理程序?,javascript,jquery,anonymous-function,document-ready,Javascript,Jquery,Anonymous Function,Document Ready,下面是我在一个具有一些复杂依赖项的项目中使用的代码。在确保所有依赖项都已加载后,我启动下面给出的onReadyCallback()。我有两个问题: 使用anonymousHandler.apply(MyNameSpace)是正确的吗?它是针对Document.ready调用的匿名处理程序的apply方法 据我所知,由于我使用的是apply方法,匿名函数将立即启动,而不考虑文档的就绪状态。那么,如何在MyNameSpace的上下文中传递给anonymousHandler,以便函数中的“this”引

下面是我在一个具有一些复杂依赖项的项目中使用的代码。在确保所有依赖项都已加载后,我启动下面给出的onReadyCallback()。我有两个问题:

  • 使用anonymousHandler.apply(MyNameSpace)是正确的吗?它是针对Document.ready调用的匿名处理程序的apply方法
  • 据我所知,由于我使用的是apply方法,匿名函数将立即启动,而不考虑文档的就绪状态。那么,如何在MyNameSpace的上下文中传递给anonymousHandler,以便函数中的“this”引用MyNameSpace

    var onReadyCallback = function(){
        jQuery(document).ready(function(){
           if(!this.loggedIn()){
              return;
           }
           ...Lots of Code referring to MyNameSpace using "this"
    
        }.apply(MyNameSpace));
    };
    
    //load the additional files that are needed and fire onReadyCallback
    MyNameSpace.Util.loadFiles(defaultJsFiles,function(){ 
        MyNameSpace.Util.require(['My.App','My.Theme','My.DomHandler'], function(){
           onReadyCallback.apply(window);          
        });
    });
    

  • 使用匿名函数和


    通常,
    ready
    event jQuery函数的调用方式如下

    $(function() { /* ... */ });
    // or 
    jQuery(function() { /* ... */ });
    // or
    jQuery(document).ready(function() { /* ... */ });
    
    底线是,函数没有给定特定的上下文;jQuery为函数提供的实际上下文是
    HTMLDocument
    元素,与参数无关(在上一个示例中,
    document
    )。这是另一个问题

    通常,这些函数中的每一个都会在加载完所有内容后调用,但不一定。在您的例子中,在
    ready
    事件发生之前,有一个对
    MyNameSpace
    的引用。即使Javascript是一种类型语言,并且它会在以后发现声明的符号,这也不是一种好的实践。如果在jQuery触发
    ready
    回调函数之前,将
    MyNameSpace
    设置为其他值,该怎么办?您的
    ready
    回调将无法获取该新引用。除非是有意的,否则当所有内容都是….时,应该在
    ready
    回调中进行引用。。。。准备好了

    然后,在
    ready
    回调中,还有其他技术可以为函数分配上下文。基本上已经给出了正确的方法来完成你想要做的事情

    (function() {
        // this == MyNamespace
    }).call(MyNamespace);
    
    上面的代码立即执行一个匿名函数,其中
    this==MyNameSpace

    注意:说明应用和调用之间的区别

    现在,是您提供的代码的底部部分:

    //load the additional files that are needed and fire onReadyCallback
    MyNameSpace.Util.loadFiles(defaultJsFiles,function(){ 
        MyNameSpace.Util.require(['My.App','My.Theme','My.DomHandler'], function(){
           onReadyCallback.apply(window);          
        });
    });
    
    这是有问题的,也是不必要的。函数
    onReadyCallback
    是否仅在此处需要,还是会被多次调用?如果只需要调用一次,请保留全局命名空间,只需执行以下操作:

    //load the additional files that are needed and fire onReadyCallback
    MyNameSpace.Util.loadFiles(defaultJsFiles,function(){ 
        MyNameSpace.Util.require(['My.App','My.Theme','My.DomHandler'], function(){
    
           // if everything is done loading, the function will be executed, otherwise
           // it's execution will be postponed later
           jQuery(function() {
    
               // create our nicely wrapped anonymous function now
               (function() {
                  if(!this.loggedIn()){
                     return;
                  }
                  // ...Lots of Code referring to MyNameSpace using "this"
    
               })(MyNameSpace);  // grab our most recent reference of `MyNameSpace`
    
           });
        });
    });
    
    如果您不喜欢缩进(这只是开发人员的口味),请将
    ready
    回调中的所有内容替换为(类似于):

    并在全局空间的外部创建您的函数:

     function initMyNameSpace() {
        if(!this.loggedIn()){
           return;
        }
        // ...Lots of Code referring to MyNameSpace using "this"
    
     };
    
    但我建议,至少,把它放在
    require
    回调函数中,这样它

  • …不会使用run once函数污染全局命名空间
  • …不可从任何地方访问(保密)
  • …可以在编辑源代码时快速找到
  • 等等
  • 注意:通常使用apply和call来避免重复访问对象,如
    some.thing.pretty.deep=value或者当一个函数需要应用于多个而不是所有对象时,因此扩展对象的原型不是一个好主意


    不管怎样,这是我的观点,我会这样做,而不知道您的代码或您正在做什么。

    我希望您的其余代码不会像这样。无意冒犯…@yanick rochon:)你为什么觉得太乱了?任何提示(一篇博客文章、一本书或两本书)都将不胜感激……因为对这条评论的回答需要一些发展,我将为您的评论添加一个答案question@yanick-罗雄,当然。谢谢,任何有助于改进我的编程风格的建议都是非常受欢迎的。谢谢,使用另一个匿名函数似乎可以解决传递上下文的问题。我对javascript还是很陌生:我认为无论文档的就绪状态如何,anonymousHandler.apply(MyNameSpace)都会立即启动的假设是正确的?是的,无论何时运行回调,它都会运行。非常感谢您花时间编写详细的解释,这里有一些非常有用的要点/提示。。。这肯定有助于加深我对这些东西的理解。
     initMyNameSpace.apply(MyNameSpace);
    
     function initMyNameSpace() {
        if(!this.loggedIn()){
           return;
        }
        // ...Lots of Code referring to MyNameSpace using "this"
    
     };