如何在 CoffeeScript 和 Rails 6 中调用函数?

How to call a function in CoffeeScript and Rails 6?

我正在尝试按照我认为是在 rails 的旧版本上完成的动作电缆教程进行操作。他们在 CoffeeScript 中使用了以下函数。但是,当我尝试 运行 它时,控制台会打印出附加到相应尝试代码块的错误。第一块是教程,第二块是我尝试解决问题。

问题是教程没有明确解释 APP 的用途或它代表什么。

(function() {
    this.App || (this.App = {});
    App.cable = ActionCable.createConsumer();
}).call(this);

Error:
CoffeeScriptError: C:\Users\User\Documents\Projects\ror\ror-portfolio-1-dev-match-master\app\javascript\packs\application_coffee.coffee:23:2: error: reserved word 'function'
(function() {
cableFunc {
    this.App || (this.App = {});
    App.cable = ActionCable.createConsumer();
}

cableFunc()

Error:
CoffeeScriptError: C:\Users\User\Documents\Projects\ror\ror-portfolio-1-dev-match-master\app\javascript\packs\application_coffee.coffee:24:2: error: unexpected this
    this.App || (this.App = {});

如果有人能告诉我为什么这没有编译,因为就目前而言,CoffeScript 不应该抛出它抛出的错误,我将不胜感激。

此外,我使用 webpacker:install:coffee 在我的应用程序中设置 CoffeeScript。

一个简单的 js2coffee 转换将产生:

(->
  @App or (@App = {})
  App.cable = ActionCable.createConsumer()
).call this

模式:

(function() {
    this.App || (this.App = {});
    App.cable = ActionCable.createConsumer();
}).call(this);

是一个过时但很常见的 JS 习惯用法,用于定义全局变量。虽然使用 IIFE(立即调用的函数表达式)比使用 call 和 this 更频繁。

(function(global) {
  global.App || (global.App = {});
  App.cable = ActionCable.createConsumer();
}(window));

我们的想法是,不是每个库都将其函数扩展到全局范围(或​​像 Prototype 那样增加内置对象),而是在全局范围内坚持自己的对象。将声明包装在函数中会创建一个作用域,您可以在其中声明 "private" 函数和变量,而不会泄漏到全局作用域中。

这个习语早于真正的 javascript 模块和 exportsimports 关键字。它在 2020 年和 the <marquee> element 一样时髦,并且不会像预期的那样与 webpack 一起工作。

这是因为 webpacker 实际上会将导入视为模块,并且 this 不会像在将文件内容连接在一起的 spockets 中那样被视为全局范围。

相反,您需要显式传递全局范围。

(->
  @App or (@App = {})
  App.cable = ActionCable.createConsumer()
).call window