我试图按照一个动作电缆教程来做,我相信这个教程是在旧版本的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定义globals的习惯。虽然使用IIFE(立即调用函数表达式)被发现更多的时候,然后使用调用和 this
.
(function(global) {
global.App || (global.App = {});
App.cable = ActionCable.createConsumer();
}(window));
我们的想法是,与其让每个库用它的函数(或像Prototype那样增强内置对象)来冲击全局范围,不如在全局范围内坚持自己的对象。将声明包在函数中创建一个作用域,在这个作用域中,你可以声明 "私有 "的函数和变量,而不会将它们泄漏到全局作用域中。
这个成语早于真正的javascript模块和 exports
和 imports
关键字。其在2020年的时髦程度就像 的 <marquee>
元素 而在webpack中无法正常工作。
这是因为webpacker实际上会把导入的模块和 this
不被视为全局作用域,因为它在spocket中只是将文件内容连接在一起。
相反,你需要明确地传递全局作用域。
(->
@App or (@App = {})
App.cable = ActionCable.createConsumer()
).call window