Javascript jQuery中的函数作用域

Javascript jQuery中的函数作用域,javascript,jquery,Javascript,Jquery,我在HTML文件顶部的标记中有此代码 $(document).ready(function() { $('#scrollbar1').tinyscrollbar(); $('a.jqtree_common').click(updateScrollbar()); }); $(function updateScrollbar() { var oScrollbar = $('#scrollbar1'); oScrollbar.tinyscrollbar();

我在HTML文件顶部的
标记中有此代码

    $(document).ready(function()
{
    $('#scrollbar1').tinyscrollbar();
    $('a.jqtree_common').click(updateScrollbar());
});

$(function updateScrollbar()
{
    var oScrollbar = $('#scrollbar1');
    oScrollbar.tinyscrollbar();
    oScrollbar.tinyscrollbar_update();

    $('a.jqtree_common').click(updateScrollbar());
});
但由于某种原因,当我运行此程序时,它会说
updateScrollbar()
(document).ready中未定义。当我试图在
(文档)中定义
updateScrollBar()
时,ready
然后
updateScrollBar()
陷入了某种无休止的循环

我的问题有两个:

  • 如何使
    updateScrollBar()
    (document).ready的范围内定义
  • 是否有更好的方法将此函数分配给
    'a.jqtree\u common'
    元素?它们在运行时动态创建,并在使用网页时进行修改。我希望函数在每次单击其中一个时运行
  • 我用的是小巧的

    编辑:我想要
    $('a.jqtree_common')。单击(updateScrollbar)分配,因为我相信单击
    'a.jqtree\u common'
    元素会创建更多
    'a.jqtree\u common'
    元素。

    尝试以下代码:

     $(document).ready(function() {
    
        var updateScrollbar = function () {
            var oScrollbar = $('#scrollbar1');
            oScrollbar.tinyscrollbar();
            oScrollbar.tinyscrollbar_update();
        };
    
        $('#scrollbar1').tinyscrollbar();
        $('a.jqtree_common').click(updateScrollbar).click();
    });
    

    将函数引用作为回调传递,而不是在Click事件中传递函数的结果
    ()
    将调用函数并将结果设置为回调,inturn将再次调用函数内部的updatescrollbar,并以无限循环的方式运行

     $(document).ready(function()
    {
        $('#scrollbar1').tinyscrollbar();
        $('a.jqtree_common').click(updateScrollbar);
    });
    
    function updateScrollbar()
    {
        var oScrollbar = $('#scrollbar1');
        oScrollbar.tinyscrollbar();
        oScrollbar.tinyscrollbar_update();
    
        //$('a.jqtree_common').click(updateScrollbar);
    }
    

    要绑定稍后加载的元素,我们必须使用(
    函数)上的

    $(document).ready(function(){
     $('#scrollbar1').tinyscrollbar();
     $(document).on("click","a.jqtree_common", updateScrollbar);
    });
    
    
    function updateScrollbar(){
     var oScrollbar = $('#scrollbar1');
     oScrollbar.tinyscrollbar();
     oScrollbar.tinyscrollbar_update();
    }
    
    如果需要范围限制,则在块内声明函数

    $(document).ready(function(){
     $('#scrollbar1').tinyscrollbar();
     $(document).on("click","a.jqtree_common", updateScrollbar);
    
     function updateScrollbar(){
      var oScrollbar = $('#scrollbar1');
      oScrollbar.tinyscrollbar();
      oScrollbar.tinyscrollbar_update();
     }
    
    });
    

    好吧,我知道在这一点上有很多帽子在拳击场上,但这是我的参赛作品一样

    //IMMEDIATELY-INVOKED FUNCTION EXPRESSION (IIFE)
    // Used for privacy/variable scoping
    (function(){
    
      //bind init function to dom-ready event
      $(init); //same as $(document).ready(init);
    
      //initialize event bindings for page
      function init() {
        //initialize scrollbar
        $('#scrollbar1').tinyscrollbar();
    
        //click binding for tree
        $('a.jqtree_common').click(updateScrollbar);
    
        //assuming you want to run the updateScrollbar on page load 
        //in addition to clicks
        updateScrollbar();
      }
    
      //handles scrollbar updates
      function updateScrollbar() {
        //assuming the tinyscrollbar() initialization only needs 
        //to happen once, inside the initialization event.
        $('#scrollbar1').tinyscrollbar_update();
      }
    
    }());

    上面的结构基本上就是我处理事情的方式……我首先处理变量,然后在顶部进行事件绑定,下面是我的函数声明。这是因为函数提升(在JS的编译中,函数声明移动到顶部),这不适用于函数赋值(例如:
    var x=function)(){…}
    ),然后我将整个内容包装在一个文件中。我发现这种结构更易于阅读和理解。我不喜欢将绑定放在底部,因为我发现你必须反复阅读才能找到你想要的内容。

    这就是我最终的工作:

    $(document).ready(function()
    {
        $('#scrollbar1').tinyscrollbar();
        $('a.jqtree_common').click(updateScrollbar);
    
        function updateScrollbar()
        {
            var oScrollbar = $('#scrollbar1');
            oScrollbar.tinyscrollbar();
            oScrollbar.tinyscrollbar_update();
    
            $('a.jqtree_common').click(updateScrollbar);
        }
    });
    

    $('a.jqtree_common')。单击(updateScrollbar());
    应该是
    $('a.jqtree_common')。单击(updateScrollbar);
    做了一个小改动来更正JS,此外,我倾向于依靠函数提升将我的函数定义放在我的事件绑定之下,但没有改变这一点。函数提升在这种情况下不起作用。只有变量
    updateCollbar
    被提升,而不是值。我知道,必须重构才能使用
    函数updateScrollbar…
    在绑定下面。确实如此。顺便说一句:所以礼仪只是针对格式问题或拼写错误编辑答案/帖子。如果是代码更改,最好留下评论。在这种情况下,我同意编辑,但你可以想象,如果我不同意你的更改和回复,可能会引发一场大讨论-第四次编辑游戏。只需删除围绕函数的
    $(
    );
    。DOM不需要准备好声明函数。使用事件绑定时,函数不需要()或在浏览器读取该行时调用。@caps我们必须使用此
    。on(
    用于动态绑定的函数elements@RohitAgrawal这是为什么?它不使用bind元素,而是使用静态元素,如document,例如
    $(document).on(
    然后它会查找目标并与提供的选择器匹配,这样在添加该元素时就不必一次又一次地绑定,请看我的answer@JuanMendes没有找到您?范围仍需要修复。您需要删除
    $(
    函数更新滚动条()之前的
    ,以及匹配的
    @JuanMendes Man你设置注释时,我可能正在键入。这是最接近我的答案,只是我没有注释掉
    $('a.jqtree_common')。单击(updateScrollbar);
    行。我尝试了这两种方法,但没有一种对我有效。我能让小提琴看看吗