Javascript 为什么我在Jquery中选择的方法切换不起作用? 问题

Javascript 为什么我在Jquery中选择的方法切换不起作用? 问题,javascript,jquery,dom,toggle,this,Javascript,Jquery,Dom,Toggle,This,我刚开始学习javascript。我试图以一种更模块化的方式复制一段工作代码。它帮助我保持事物的整洁,并且更好地理解它 我确信有更好的高效或简洁的方法来实现代码的功能,所以请女士们/先生们不要客气,你可以省点力气。这里的重点是通过玩代码来学习我还不理解的东西 代码的作用是什么 它创建了该方法的替代方法 然后可以按以下方式使用$'foo h2'。mytoggleplus,减号 下面是原始代码: 以下是我之前代码的版本: 问题 为什么原始版本使用 每个人把这个还给我 而不是每个都退回$1美元 注意:

我刚开始学习javascript。我试图以一种更模块化的方式复制一段工作代码。它帮助我保持事物的整洁,并且更好地理解它

我确信有更好的高效或简洁的方法来实现代码的功能,所以请女士们/先生们不要客气,你可以省点力气。这里的重点是通过玩代码来学习我还不理解的东西

代码的作用是什么 它创建了该方法的替代方法 然后可以按以下方式使用$'foo h2'。mytoggleplus,减号

下面是原始代码: 以下是我之前代码的版本: 问题 为什么原始版本使用 每个人把这个还给我 而不是每个都退回$1美元

注意:我不能在我的版本上使用此选项,否则它将返回一个错误:uncaughttypeerror:Object[Object global]没有“each”方法 不是每个都是jQuery方法吗

据我所知,在使用它时,可以对其调用DOM方法,但不能调用jQuery方法。反之亦然。 为什么我的版本不起作用?我错过了什么

注意:我没有错误,所以调试起来比较困难。
当您将函数分配给$.fn时,它将在jQuery的上下文中执行,因此这是一个jQuery对象。函数很可能在窗口的上下文中执行。如果将最后一行更改为此,则其工作原理应完全相同:

$.fn.clicktoggle = call_a_or_b(a,b);
在plugin对象中,它指的是启动插件的jQuery包装器对象,而不是其他方法中的dom对象 因为这是jQuery包装器对象。每个都是可用的 您的实现中存在多个问题 当您调用call_a_或_b时,您没有将执行上下文传递给该方法,因此该方法中的内容引用窗口对象 根据经验,要在jQuery中启用链接,您需要返回jQuery包装器,但您没有这样做 替代方法存在与关闭和调用相关的问题 试一试


演示:

他们使用这个而不是$this,因为它已经具有jquery对象的功能范围,因此不需要被jquery对象包装来回答您的1和2,您读过吗?该值的设置取决于函数的调用方式,它不是自动的,并且始终是DOM元素。在插件的情况下,它将是调用插件方法的jQuery集合。谢谢大家。我确实知道这一点,但由于对闭包的理解不好,我感到困惑。现在一切都好了。首先,谢谢你。迅速的答复给我留下了深刻的印象。您帮助我专注于了解您的解决方案所需的内容。看到有这么多令人惊叹的人,我感到非常振奋。谢谢你的尝试,但这个答案并不完全正确。更改最后一行不会使代码正常工作。请记住,我需要传递参数,以便首先使用mytoggle方法调用_a_或_b。即使我不需要这样做,它仍然不起作用——然后我需要将执行上下文传递给我相信的备选方法。请参考@arun答案。
function call_a_or_b (a,b) {
    var clicked = false;
    function alternate (a,b) {
        if (clicked) {
        clicked = false;
        return a.apply(this, arguments);
        }
        else {
        clicked = true; 
        return b.apply(this, arguments);
        }
    } // end function alternate


    return $(this).each(function () {$(this).click(alternate(a,b))}); 
} //end function call_a_or_b

$.fn.clicktoggle = function(a,b) {  call_a_or_b(a,b); };
$.fn.clicktoggle = call_a_or_b(a,b);
(function ($) {
    function call_a_or_b(a, b) {

        //for each matched element the clicked variable should be a closure one, so needed to rearrage it a bit        
        function alternate(el) {
            var clicked = true;
            $(this).click(function () {
                if (clicked) {
                    clicked = false;
                    return a.apply(this, arguments);
                } else {
                    clicked = true;
                    return b.apply(this, arguments);
                }
            })
        } // end function alternate

        return $(this).each(alternate);
    } //end function call_a_or_b

    $.fn.clicktoggle = function (a, b) {
        //call the method with the current execution context and return the value returned fromit
        return call_a_or_b.apply(this, arguments);
    };
})(jQuery);