【问题标题】:jQuery - function inside $(document).ready functionjQuery - $(document).ready 函数中的函数
【发布时间】:2011-07-21 18:30:49
【问题描述】:

在里面创建函数是否正确

$(document).ready(function() {

像这样:

$(document).ready(function() {
     function callMe() {

     }
 });

.ready() 内部的函数不必在 DOM 准备好并触发ready() 内部的事件之前调用。

只是为了澄清一点 - 这是说明问题的代码:

$(function() {
    var ind = 0;

    // some event is executed and changes the value of the ind

    // another event which affects the ind variable

    // and another one - after this event we call our function


    // there's another event - and we call our function again

我需要调用的函数需要 ind 变量的更新值 - 我想我可以将其作为参数传递,但有更好的方法吗?

另外 - 另一个重要的事情是,有问题的 function() 也可以更改 ind 变量的值 - 例如递增它 (ind++)。

【问题讨论】:

    标签: jquery document document-ready


    【解决方案1】:

    是的,你可以这样做,这只是scope 的问题。

    如果您只需要从$(document).ready(function() { }) 中访问callMe(),那么可以将函数放在那里,并提供一些架构优势,因为您无法在该上下文之外访问该函数。

    如果您需要在文档就绪之外使用callMe() 函数,则需要在该上下文之外定义callMe() 函数。

    function callMe() {
      // Do Something
    }
    
    $(document).ready(function() {
      callMe();
    });
    

    更新

    根据您的说明,您有两种选择:

    1) 在ready() 之外声明变量,然后在ready() 内部定义变量:

    var someVariable;
    function callMe() {
      someVariable++;
      alert(someVariable);
    }
    
    $(document).ready(function() {
      someVariable = 3;
      callMe(); // Should display '4'
    });
    

    2) 在ready() 中,使用window.yourVariable = 'whatever'; 定义变量

    【讨论】:

    • 它甚至会执行他的内部功能吗?它只是声明它,但对声明没有任何作用,因此它不会产生任何影响。 ??
    • 没错,它只是定义,而不是调用它。我想不出您想要延迟函数定义的原因?
    • 这个选项会比在 ready() 中包含函数更好吗 - 我听说使用全局变量不是一个好方法 - 但话又说回来 - 我不太清楚为什么。
    • 是的,如果可能的话,我会说尽量避免使用全局变量。原因是因为它变得混乱。如果你有多个读/写函数,事情可能会很快变得棘手。话虽如此,有一些方法可以更好地组织全局变量,例如对象文字,这可以帮助对功能和属性进行分组。
    • 谢谢 Mike - 我想我需要花一些时间来学习面向对象的 Javascript。感谢您的帮助 - 似乎没有更好的方法了。
    【解决方案2】:

    这也可以。

    $(document).ready(function() {
          callMe = function() {
                alert('hello');
          }
    });
    
    callMe();
    

    如果你使用

     var callMe = function () { ... }
    

    它可能不起作用,您可能会收到错误“函数未定义”

    【讨论】:

      【解决方案3】:

      当您在$(document).ready 中创建函数时,可以保证在文档加载之前不会调用它。当然,它只能从该事件处理程序本身调用(在事件处理程序的稍后位置)。

      换句话说,您尝试做的事情是有效的(尽管不一定是可取的 - 您必须透露更多关于您尝试完成的事情)。

      【讨论】:

      • 你认为将参数传递给这个函数而不是在 ready() 方法中声明它会是一个更好的选择吗?
      • @user398341 - 如果没有更好地了解您要做什么,很难说。但是,听起来您认为任何在$(document).ready 之外声明 的内容都会立即执行,即使文档还没有准备好。您的函数只会在它被调用时执行,无论何时/何地发生。
      • 这不是我的想法和我想要做的。在 ready() 外部声明的函数使用在 ready(function() 内部声明的变量,因此如果函数在外部声明,我无法访问这些变量。我相信唯一的其他选择是将参数传递给外部的 function() dom
      【解决方案4】:

      你可以这样做:

      $(document).ready(function(){
      
          var callMe = function(){
             //enter code here
          }
      
          $(".my-class").on("click", function(){
             callMe();
          });
      
      });
      

      因此,您无需将函数放在文档之外准备就绪,代码会变得分组且更有条理。 ;)

      【讨论】:

      • 您可以将活动设为单行:$(".my-class").on("click", callMe);
      【解决方案5】:

      像这样直接调用函数可能更好:

      $(document).ready(myFunction);
      
      function myFunction() {
      
         // Your code here
      
      }
      

      【讨论】:

        【解决方案6】:

        这绝对是合法的。问题是你为什么要这样做?可能是将函数的范围绑定到 ready 的范围,而不是将其全局绑定到 window 对象。但这真的是你想要的吗?我建议看看 javascript 中的函数闭包以及它如何处理范围。帮助澄清对它的需求......

        【讨论】:

        • 我之所以要将它放在 ready() 方法中,是因为它使用了 ready() 中定义的一些变量,如果该函数是在 ready() 之外声明。这些变量会根据不同的行为而变化,并且可能会在许多不同的场合调用此特定函数。
        • 如果您说 ready() 函数创建全局变量,那么在 ready() 内部或外部定义该函数仍然没有关系。只要您的实现在正确的时刻运行,您的函数就可以使用在 ready() 中定义的全局变量
        • 我不知道你可以在另一个函数中使用声明的变量 - 我会试试看它是否有效。
        • 它似乎不起作用 - 这就是我所拥有的: $(function(){ var ind = 0; 然后在那个 function() { ind++; } 之前 - 但正如我想 - 它似乎不起作用......
        • 对,变量不能在函数中全局声明,除非你像window.yourVariable = '';这样定义'任何'; }
        【解决方案7】:

        看看你是否可以通过将你的标签移动到 html 文件的底部来消除使用 document.ready 的需要。这应该使事情变得更简单。否则,在 document.ready 范围之外声明该函数,并在 document.ready 函数范围内调用它。

        【讨论】:

          【解决方案8】:

          你可以像下面这样使用:

          $(document).ready(function () {
              printReport = function(rowIndex) {
                  // Your code here
              }
          });
          

          您可以从任何事件中调用此函数。

          【讨论】:

            猜你喜欢
            • 2012-02-17
            • 2014-01-13
            • 2015-11-12
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多