【问题标题】:coffeescript pass arguments to returned functioncoffeescript 将参数传递给返回的函数
【发布时间】:2015-05-20 19:46:54
【问题描述】:

我不确定我在 CoffeeScript 中尝试完成的工作是否有 JavaScript 术语,但这是用例:

我正在使用 CommonJS 加载 JS 模块,它们可能会加载对象、函数、任何东西。 例如,如果我加载了一个对象字面量,我可以访问它的属性in-line,链接在 require() 调用之后。

// car.js returns an object properties and methods
var make = require('car').make

这在 CoffeeScript 中也是可能的,因为他们引入了方法链:

make = require 'car'
  .make

但是……

在 JS 中,如果 require()'d 文件返回一个函数,我可以直接调用它:

// drive.js 
module.exports = function(distance, speed) {
  return distance / speed;
}

// index.js
var hours = require('drive')(1200, 120); // 10

以下尝试会导致错误:

// drive.coffee
module.exports = (distance, speed) ->
  distance / speed

// index.coffee
hours = require 'drive' 1200, 120           // error unexpected number
hours = require 'drive'
  1200, 120                                 // error unexpected indentation
hours = require 'drive' (1200, 120)         // error unexpected (

CoffeeScript 怎么做?

【问题讨论】:

  • 你还是可以的hours = require('drive')(1200, 120)
  • 说真的,coffeescript 的声明之一是提高了可读性。 require 'drive' 1200, 120require('drive')(1200, 120) 可读性如何? (事实并非如此,幸运的是它也是错误的。)
  • 首先,这部分是为了更好地理解 CS 语法的练习。其次,我确实相信require 'drive' (1200, 120),例如,非常易读和直观
  • 但是你为什么期望f x (y)f(x)(y) 而不是f(x(y))?或者,如果 CoffeeScript 知道它正在使用字符串文字,您是否希望它表现得特别好?
  • 我没想到 - 这就是为什么我想知道这些动态回调是否有另一种形式的特殊语法,比如新的方法链接语法

标签: coffeescript method-chaining


【解决方案1】:

答案是括号。

// drive.coffee
module.exports = (distance, speed) ->
  distance / speed

// index.coffee
driveFunction = require('drive')
hours = driveFunction(1200, 120)

或更短

hours = require('drive')(1200, 120)

【讨论】:

  • 嗯,这几乎是 JavaScript 语法......我试图了解是否有某种 CS 语法可以编译成这个。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-29
  • 1970-01-01
相关资源
最近更新 更多