【问题标题】:Coffeescript --- How to create a self-initiating anonymous function?Coffeescript --- 如何创建一个自启动的匿名函数?
【发布时间】:2011-08-02 02:15:56
【问题描述】:

如何在coffeescript中写这个?

f = (function(){
   // something
})();

感谢任何提示:)

【问题讨论】:

    标签: javascript javascript-framework coffeescript


    【解决方案1】:

    抱歉,我解决了:

    f = (
        () -> "something"
    )()
    

    【讨论】:

    • @Squeegy 我不一定会这么说。 do 关键字有一些限制,有时需要使用 JS 风格的方法(参见 issue 960); do 实际上只是因为带有闭包的循环用例而被添加。
    • 但我们也没有使用 CoffeeScript 来打自己的脸。
    【解决方案2】:

    虽然您可以只使用括号(例如 (-> foo)(),但您可以通过使用 do 关键字来避免它们:

    do f = -> console.log 'this runs right away'
    

    do 最常见的用途是在循环中捕获变量。例如,

    for x in [1..3]
      do (x) ->
        setTimeout (-> console.log x), 1
    

    如果没有do,您只会在循环 3 次后打印x 的值。

    【讨论】:

    • 你也可以写f = do -> console.log x
    • @scribu 嗯,这两个陈述非常不同,而你的陈述实际上是我应该给出的。我的将函数-> console.log 'this runs right away'分配给f,然后运行它;你的运行该函数,然后将其结果分配给f,就像在原始问题中一样。 (虽然在console.log的情况下,返回值始终是undefined。)
    • 没错。此外,您可以通过这种方式定义对象属性:{f: do -> // something}
    • 从 CoffeeScript 1.3.1(2012 年 4 月发布)开始,do 还允许您将参数传递给函数。要将1 和2 作为参数x 和y 传递,请编写do (x = 1, y = 2) ->。 (此功能的文档有gotten lost,但the issue where the feature was introduced 有一些示例。)
    【解决方案3】:

    如果您想为 CoffeeScript 中传递给自调用函数的参数“别名”,假设这就是您想要实现的目标:

    (function ( global, doc ) {
      // your code in local scope goes here
    })( window, document );
    

    那么do (window, document) -> 不会让你这样做。那么要走的路是用括号:

    (( global, doc ) -> 
      # your code here
    )( window, document ) 
    

    【讨论】:

    • do (global=window, doc=document) ->
    【解决方案4】:

    尝试使用

    do ($ = jQuery) ->
    

    【讨论】:

      【解决方案5】:

      您还可以将do 关键字与默认函数参数结合起来,为具有初始值的递归“自启动函数”提供种子。示例:

      do recursivelyPrint = (a=0) ->
        console.log a
        setTimeout (-> recursivelyPrint a + 1), 1000
      

      【讨论】:

        【解决方案6】:

        喝咖啡很容易:

        do ->
        

        将返回

        (function() {})();
        

        【讨论】:

          【解决方案7】:
          do ->
              #your stuff here
          

          这将创建一个自执行闭包,这对于范围界定很有用。

          【讨论】:

          • 与已经发布的其他答案相比,这似乎并没有添加大量新信息。您可以通过在另一个答案下发布信息性评论来增加更多价值,而不是创建一个竞争性答案,从而为另一个答案添加一些清晰或有用的信息。
          【解决方案8】:

          应该是

          f = () ->
            # do something
          

          【讨论】:

            猜你喜欢
            • 2011-12-03
            • 1970-01-01
            • 2012-01-04
            • 2011-05-09
            • 2016-09-09
            • 2021-08-11
            • 2012-04-18
            • 2012-04-25
            • 1970-01-01
            相关资源
            最近更新 更多