Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/450.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 CoffeeScript/jQuery语法可以简化吗?_Javascript_Jquery_Coffeescript - Fatal编程技术网

Javascript CoffeeScript/jQuery语法可以简化吗?

Javascript CoffeeScript/jQuery语法可以简化吗?,javascript,jquery,coffeescript,Javascript,Jquery,Coffeescript,我很欣赏CoffeeScript语法如何帮助编写回调函数,并使jQuery语法更加轻巧。然而,我仍然为经典的$(“.foo”)结构而烦恼:只有3个“有意义”的字符才有6个符号!就我所知,不幸的是,CoffeeScript无法简化这种语法。或者可以吗?您是否有jQuery/CoffeeScript gem可供共享?或者,是否有一些CoffeScript库被设计为使jQuery的使用更轻松 作为练习,我们是否可以简化此代码 $ ->

我很欣赏CoffeeScript语法如何帮助编写回调函数,并使jQuery语法更加轻巧。然而,我仍然为经典的
$(“.foo”)
结构而烦恼:只有3个“有意义”的字符才有6个符号!就我所知,不幸的是,CoffeeScript无法简化这种语法。或者可以吗?您是否有jQuery/CoffeeScript gem可供共享?或者,是否有一些CoffeScript库被设计为使jQuery的使用更轻松

作为练习,我们是否可以简化此代码

$ ->                                        # nice!
  $('.menu').hide()                         # no benefit over JS ?
  $('.sub').hover -> 
    offset = $(@).offset()                  # $(@) is $(this) but the syntax feels awkward
    submenu = $(@).siblings "ul"            # optional parens...
    submenu.css 
      left: offset.left + $(@).outerWidth()
      top: offset.top
    submenu.show()                          # can't get rid of parenthesis ?
  , ->                                      # weird
    $(@).siblings("ul").hide()              # ...in this case, non-optional parens

Coffeescript只是编写JS的语法糖(顺便说一句,我喜欢)。你无法摆脱JS强加给CS的对象模型

您始终可以执行以下操作:

menu = $ ".menu" 
但这并不能给你买任何东西

就您的代码示例而言,您可以用任何语言编写不可读的代码。JS中的等效代码甚至更不可读(对于熟悉CS和JS的人来说)。通过将回调分解成更小的部分,可以使代码更具可读性。如果你真的想,你可能会考虑子菜单代码与偏移代码分开…但没什么大不了的:

hoverIn = -> 
  offset = $(@).offset() 
  submenu = $(@).siblings "ul"            
  submenu.css 
    left: offset.left + $(@).outerWidth()
    top: offset.top
  submenu.show()  

hoverOut = -> $(@).siblings("ul").hide()

$ ->
  $('.menu').hide()                        
  $('.sub').hover hoverIn, hoverOut

这是一个可以在任何语言中使用的技巧。

您是否尝试过编写可读代码

$(function () {
    function hover_in() {
        var offset = sub.offset();

        submenu.css({
            left: offset.left + sub.outerWidth(),
            top: offset.top
        }).show();
    }

    function hover_out() {
        submenu.hide();   
    }

    var sub = $(".sub"),
        submenu = sub.siblings("ul");

    sub.hover(hover_in, hover_out);
    $(".menu").hide();
});

如果您想要非常简洁的代码,请使用不同的语言(perl、APL、LISP)

我发现您的代码是非常好的CoffeeScript,solendil。你在短短几行中做了很多不同的事情,这在任何语言中都会显得有点嘈杂

一些细节:

  • 独立
    @
    的使用在咖啡编剧中引起了分歧
    这个
    的行为与JS中的任何其他构造都非常不同,因此我认为给它一个弹出的符号是有意义的,它提醒你问:“哇,哇,你希望我的意思和我在回调之外做的一样吗?”
  • 有一种方法,如果被采用,将允许你写作

    $(@).siblings("ul").hide()
    
    作为

    这也适用于空格,如下所示:

    $ @
    .siblings "ul"
    .hide()
    
    你应该去表达你的支持

  • 对于不带参数的函数调用,另一种方法是编写
    do func
    ,编译为
    func()
    。我不推荐这个

  • 至于

    然而,我仍然为经典的
    $(“.foo”)
    结构而烦恼:只有3个“有意义”的字符才有6个符号


    怎么会这样?至少,
    $
    (函数名)和
    .foo
    (选择器字符串)组成4个有意义的字符。在任何主流语言中,我都没有看到字符串分隔符的替代品。因此,我要说的是,那里有意义的字符比率相当不错。:)

    你也许可以省略括号,但那看起来很难看。知道何时运行jQuery选择器是很重要的——应该在每个选择器上运行一次(如果可能),并缓存结果,这样可以将代码简化为变量名……老实说,我不明白为什么有些程序员会痴迷于CoffeeScript。据我所知,在CS中编程就像用袖珍计算器进行微积分测试——当然更简单,但只要你有简单的问题要解决。--当然更简单,但只要你有简单的问题要解决——Javascript也可以这样说,然而,有些人已经成功地在JS中实现了令人印象深刻的编程壮举。。。不管怎么说,我目前正在评估CS,它很有光泽,令人愉快,但我担心缺乏适当的调试、本机浏览器支持和dev env工具将很快让我离开。可悲…@solendil是的,这就是我的意思——CS让做简单的事情变得容易,而做困难的事情变得不可能。我并不反对它——欢迎大家使用他们最喜欢的工具——但我看不出任何情况下,它能使一项非常大的工作变得更简单。@mblase75从一个非常大的CS项目的经验来看,我可以说,做任何事情都更容易,而且不会使任何事情变得更困难。(最坏的情况是你在JS中加入了反勾号,但我们只做了3次。)它使一个非常大的工作变得更简单,因为它更可读。耶!您的代码与我的代码行数完全相同,但更易于阅读。伟大的然而,在定义大量命名函数(在您的例子中是hoverIn和hoverOut)时,我遇到了全局名称空间污染的问题。您是否有一个解决方案将其范围限制在使用它们的地方?@solendil您可以使用与JS差不多的方式来命名CS;请参阅文章。默认情况下,Coffeescript文件中的代码被编译为隐藏在该文件的范围内。换句话说,文件中的所有内容都用
    (function(){//your code})()包装。因此,
    hoverIn
    hoverOut
    将不会在全局范围内声明。您必须执行类似于
    window.hoverIn=
    的操作来污染全局范围。
    $ @
    .siblings "ul"
    .hide()