【问题标题】:Executing Immediate Function执行立即函数
【发布时间】:2023-04-16 15:38:02
【问题描述】:

CoffeeScript 编译了这段代码:

mod = (num) -> num % 2

进入:

// Generated by CoffeeScript 1.7.1
(function() {
  var mod;

  mod = function(num) {
    return num % 2;
  };

}).call(this);

如何调用这个 JavaScript 即时函数?

例如,我想打电话给mod.apply(5)

【问题讨论】:

  • --bare编译或导出到window
  • 谢谢,elclanrs。关心回答信用?那么,使用coffee -c file.js,就不可能将参数传递给立即函数?
  • 因为代码就在那里,你不能从块外部调用它,因为它只作用于块内部。您将不得不更改您的 CoffeeScript 或编译选项。另外,你想要的是mod(5),而不是mod.apply(5)
  • mod.apply(5) 没有意义。阅读MDN documentation 以更好地了解.apply() 的工作原理。
  • 从问题的措辞中您的意图并不是很清楚。您希望“mod”的价值是什么?

标签: javascript function coffeescript


【解决方案1】:

你可以这样做:

mod = ((num) -> num % 2) 5

mod.apply(5) 相同,它不会调用“mod”函数使得“num”是5。相反,它会调用函数,使得 this5,我怀疑这是你真正想要做的。

我上面代码的结果是将“mod”设置为1,即5 % 2

现在,如果您只是想稍后调用“mod”,您可以使用您的原始代码,然后执行此操作:

mod5 = mod 5

【讨论】:

  • 啊,我现在明白你的回答了,谢谢。但是,如何更正此 javascript 以将 5 作为参数传递给立即函数?
  • @KevinMeredith 那个小提琴中的代码没有意义;在立即执行的函数之外,您没有名为“mod”的变量。您必须将该函数调用的结果分配给某个变量,然后调用that编辑,即使你这样做了,它也不会工作,因为它缺少return 语句。
  • @KevinMeredith 我认为问题的一部分可能是您解释翻译后的 Coffeescript 语义的方式。我不是 Coffeescript 用户(老实说,也不是粉丝),所以我不能深入探讨这个主题。
  • 我想我可能没有正确理解这个问题,我认为 OP 在全局执行该功能时遇到了问题......
  • 谢谢,@Pointy。你关于我的误解的问题让我重新思考。通过在 CoffeeScript 中简单地定义一个立即函数,输出 JavaScript 只是一个没有传递任何参数的立即函数。我错误地期望有一种方法可以使用参数调用mod 的即时函数。
【解决方案2】:

您可以使用--bare-b 进行编译,它们不会生成包装函数:

coffee -c -b file.js

或者您可以将变量导出到window

window.mod = (x) -> x % 2

或者在 NodeJS 中:

mod = (x) -> x % 2

module.exports = {mod}

apply 调用一个带有上下文的函数,我们称之为this,以及一个参数数组。 applycall 的不同之处在于您可以动态执行可变参数函数(具有任意数量参数的函数)。你会这样使用它:

mod.apply null, [2]

null 是上下文,在这种情况下无关紧要,因为您的 mod 函数不使用 this

如果你要这样写:

mod = -> @ % 2

然后你可以用上下文调用它:

mod.call 2
mod.apply 2

【讨论】: