【问题标题】:Is JavaScript function.bind() supported in google sheets?谷歌表格是否支持 JavaScript function.bind()?
【发布时间】:2020-04-25 08:56:03
【问题描述】:

这是我试图在 google sheet 脚本中运行的一个简单代码。 目的是为foreach回调函数提供附加参数。

function print(str, num) {
    Logger.log(str + ": " + num);
}

function test()
{
  var array = [1,2,3];
  var str = "Stam";
  //This line has an exception
  // TypeError: Cannot convert null to an object
  array.forEach(print.bind(null, str));
}
test();

此代码基于here 描述的解决方案。

我知道还有其他解决方案,但我想了解为什么这个不起作用。

我想也许谷歌表格不支持它。

【问题讨论】:

    标签: javascript google-apps-script google-sheets function-binding


    【解决方案1】:

    这个答案怎么样?请认为这只是几个可能的答案之一。

    在 Javascript 中,当使用 bind(null, str)null 时,使用 this。在 Google Apps 脚本中,当 null 用于 bind(null, str) 时,会出现“无法将 null 转换为对象”之类的错误。我认为这可能是谷歌方面的规范。我不确定这是否在未来的更新中被修改。那么作为当前的解决方法,使用this 而不是null 怎么样?或者如果你想在严格模式下使用bind(null, str),比如null,那么使用{}而不是null,比如bind({}, str)怎么样?

    顺便说一句,我认为可以删除脚本最后一行的test();。因为在您的情况下,当 test() 在脚本编辑器中运行时,test() 在最后一行由 test(); 运行 2 次。最后一行的test(); 作为全局运行。

    从上述情况来看,当你的脚本被修改后,接下来的修改呢?

    修改脚本:

    function print(str, num) {
      Logger.log(str + ": " + num);
    }
    
    function test() {
      var array = [1,2,3];
      var str = "Stam";
      array.forEach(print.bind(this, str));
    }
    

    或者您也可以修改脚本的test(),如下所示。以下test() 检索到与上述相同的结果。

    function test() {
      var array = [1,2,3];
      var str = "Stam";
      array.forEach(function(e) {print(str, e)});
    }
    

    结果:

    当你在脚本编辑器中运行test()时,你可以在日志中看到如下结果。

    Stam: 1
    Stam: 2
    Stam: 3
    

    参考:

    如果我误解了您的问题并且这不是您想要的方向,我深表歉意。

    【讨论】:

    • 正是我的问题,甚至更多。你是说在“纯”JS中,当为bind(null,str)提供null时,有界函数实际上得到了这个?
    • @OJNSim 感谢您的回复。我认为是的。比如console.log(this)放在函数print()没有严格模式的时候,就可以看到。另一方面,在严格模式下,当使用bind(null,str)时,可以看到null。但在现阶段,Google Apps Script 无法使用严格模式。如果我误解了您的回复并且我的评论没有用,我深表歉意。
    猜你喜欢
    • 2014-03-17
    • 2011-07-30
    • 2011-11-13
    • 1970-01-01
    • 2011-11-02
    • 2021-07-28
    • 2021-02-03
    • 2015-11-30
    • 1970-01-01
    相关资源
    最近更新 更多