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

问题描述 投票:0回答:1

我试图按照一个动作电缆教程来做,我相信这个教程是在旧版本的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。

ruby-on-rails coffeescript
1个回答
2
投票

一个简单的 js2coffee 转换会产生。

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

该模式:

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

是一个过时的,但很常见的JS定义globals的习惯。虽然使用IIFE(立即调用函数表达式)被发现更多的时候,然后使用调用和 this.

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

我们的想法是,与其让每个库用它的函数(或像Prototype那样增强内置对象)来冲击全局范围,不如在全局范围内坚持自己的对象。将声明包在函数中创建一个作用域,在这个作用域中,你可以声明 "私有 "的函数和变量,而不会将它们泄漏到全局作用域中。

这个成语早于真正的javascript模块和 exportsimports 关键字。其在2020年的时髦程度就像 <marquee> 元素 而在webpack中无法正常工作。

这是因为webpacker实际上会把导入的模块和 this 不被视为全局作用域,因为它在spocket中只是将文件内容连接在一起。

相反,你需要明确地传递全局作用域。

(->
  @App or (@App = {})
  App.cable = ActionCable.createConsumer()
).call window
© www.soinside.com 2019 - 2024. All rights reserved.