Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在coffeescript中为Google Apps脚本生成全局命名javascript函数_Javascript_Function_Coffeescript_Google Apps Script - Fatal编程技术网

如何在coffeescript中为Google Apps脚本生成全局命名javascript函数

如何在coffeescript中为Google Apps脚本生成全局命名javascript函数,javascript,function,coffeescript,google-apps-script,Javascript,Function,Coffeescript,Google Apps Script,我想为使用CoffeeScript编写Javascript脚本,但在生成预期形式的函数时遇到了问题 GoogleApps脚本希望脚本包含顶级命名函数。(我可能使用了错误的术语,因此我将举例说明我的意思…) 例如,Google Apps脚本可以很好地识别此功能: function triggerableFunction() { // ... } 。。。虽然此函数不可用(它将进行解析,但您无法触发它): 我发现使用CoffeeScript,我能得到的最接近的是上面的非triggerablef

我想为使用CoffeeScript编写Javascript脚本,但在生成预期形式的函数时遇到了问题

GoogleApps脚本希望脚本包含顶级命名函数。(我可能使用了错误的术语,因此我将举例说明我的意思…)

例如,Google Apps脚本可以很好地识别此功能:

function triggerableFunction() {
   // ...
}
。。。虽然此函数不可用(它将进行解析,但您无法触发它):

我发现使用CoffeeScript,我能得到的最接近的是上面的
非triggerablefunction
表单。生成上述
triggerableFunction
之类的命名函数的最佳方法是什么

我已经在使用'bare'选项(
-b
开关)来编译 没有顶级函数安全包装器


我在网上发现的一个结合了CoffeeScript和googleappscript的项目是,它似乎是通过使用反勾号,并要求用户手动从结果代码中删除一些行来实现的。(请参阅的末尾和的“安装”部分)。我希望有一个更简单更干净的解决方案。

结果表明,这可以通过为每个函数使用一行代码来实现

例如,这个咖啡脚本:

myNonTriggerableFunction = ->
  Logger.log("Hello World!")

`function myTriggerableFunction() { myNonTriggerableFunction(); }`
。。。将在使用“bare”选项(-b开关)调用coffee编译器时生成此JavaScript:


在上面的例子中,Google Apps脚本能够直接触发myTriggerableFunction。

这应该给你一个全局命名函数(是的,它有点粗糙,但远不如使用反勾号):


CoffeeScript不允许您隐式地在全局命名空间中创建任何内容;但是,可以通过直接指定全局名称空间来实现这一点

window.someFunc = (someParam) -> 
    alert(someParam)

只需在脚本中使用@,我的代码示例:

@isArray = (o)->
  Array.isArray(o)
该报告将汇编成:

(function() {

  this.isArray = function(o) {
    return Array.isArray(o);
  };

}).call(this);

在本例中,this=窗口,因此全局函数

似乎不会生成全局命名函数。这就是它在使用-b开关时产生的结果:(function(){return This.triggerableFunction=(function(){function triggerableFunction(arg1,arg2){}return triggerableFunction;}();}();你在浏览器中运行代码了吗?该函数是全局函数,因为它附加到全局上下文。它的名称是:
triggerableFunction.name==“triggerableFunction”
。当然,它不会生成函数语句,但我相信这并不是问题所在。代码是在谷歌应用程序脚本引擎中运行的,而不是在浏览器中运行的。我确实在问如何生成一个函数语句,谷歌应用程序脚本引擎似乎需要它。“gmail gtd bot”(使用back ticks)所使用的解决方法对我很有效。我需要在全局名称空间中附加一个函数,以便在pjax部分页面加载后调用它。这对我来说很有效。这创建了一个匿名函数,而不是命名函数。然后将匿名函数分配给someFunc。如果在新函数中设置断点并查看堆栈跟踪,这一点很明显。
window.someFunc = (someParam) -> 
    alert(someParam)
@isArray = (o)->
  Array.isArray(o)
(function() {

  this.isArray = function(o) {
    return Array.isArray(o);
  };

}).call(this);