如何在 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 模块和 exports
和 imports
关键字。它在 2020 年和 the <marquee>
element 一样时髦,并且不会像预期的那样与 webpack 一起工作。
这是因为 webpacker 实际上会将导入视为模块,并且 this
不会像在将文件内容连接在一起的 spockets 中那样被视为全局范围。
相反,您需要显式传递全局范围。
(->
@App or (@App = {})
App.cable = ActionCable.createConsumer()
).call window
我正在尝试按照我认为是在 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 模块和 exports
和 imports
关键字。它在 2020 年和 the <marquee>
element 一样时髦,并且不会像预期的那样与 webpack 一起工作。
这是因为 webpacker 实际上会将导入视为模块,并且 this
不会像在将文件内容连接在一起的 spockets 中那样被视为全局范围。
相反,您需要显式传递全局范围。
(->
@App or (@App = {})
App.cable = ActionCable.createConsumer()
).call window