Javascript 按值返回函数的函数

Javascript 按值返回函数的函数,javascript,function,reference,google-sheets,Javascript,Function,Reference,Google Sheets,我试图根据一些标准,使用谷歌脚本(JavaScript)在谷歌表单中添加指向菜单的链接。添加菜单项的步骤如下: addItem(caption, functionName) functionName参数本身不能接受输入参数,由于我的文档中有数量可变的工作表,因此我尝试在for循环中生成任意数量的函数,以便它们可以在不需要任何输入参数的情况下使用: function createGotoMenuFunctions(scope) { var ss = SpreadsheetApp.getAct

我试图根据一些标准,使用谷歌脚本(JavaScript)在谷歌表单中添加指向菜单的链接。添加菜单项的步骤如下:

addItem(caption, functionName)
functionName
参数本身不能接受输入参数,由于我的文档中有数量可变的工作表,因此我尝试在for循环中生成任意数量的函数,以便它们可以在不需要任何输入参数的情况下使用:

function createGotoMenuFunctions(scope) {
  var ss = SpreadsheetApp.getActive();
  var sheets = ss.getSheets();

  for (var s=0; s<sheets.length; s++){
    var sht = sheets[s];
    var shtName = sht.getName();
    var funcName = 'goto' + shtName.replace(/\s/g, '_') + 'menu';
    scope[funcName] =  function() {
      ss.setActiveSheet(sht);
    }
  }
}

createGotoMenuFunctions(this); //global scope
function createGotoMenuFunctions(范围){
var ss=SpreadsheetApp.getActive();
var sheets=ss.getSheets();

对于(var s=0;screateGotoMenuFunctions闭包将保留最后一页的sht副本,因为它在末尾声明。当函数执行时,它将在自己的闭包中找不到sht,并将接近封闭它的闭包。因此它将获得sht(最后一页副本)

要获得正确答案,应在函数后立即使用bind:


scope[funcName].bind({sht:sheets[s]})
CreateGoTomenuffunctions闭包将保留sht的一个副本,这是最后一个工作表,因为它在结尾声明。当函数执行时,它将在自己的闭包中找不到sht,并将接近封闭它的闭包。因此它将获得sht(最后一个工作表副本)

要获得正确答案,应在函数后立即使用bind:


scope[funcName].bind({sht:sheets[s]})
这里还有一种将
sht
绑定到闭包的方法:

scope[funcName] = function(_sht) {
  return function() {
    ss.setActiveSheet(_sht);
  }
}(sht);

(参见此问题,类似:)

这里还有一种将
sht
绑定到闭包的方法:

scope[funcName] = function(_sht) {
  return function() {
    ss.setActiveSheet(_sht);
  }
}(sht);

(见此问题,类似:)

如果
工作表
是数组,则使用
工作表。forEach
带有回调函数(而不是
for
循环),它将创建所需的闭包,以确保
sht
引用正确的内容。第一个问题@castoridae问得非常好,但是,如果引用API或文档,请提供链接,因此我们都在同一页上;谢谢:-)欢迎来到StackOverflow,祝贺您的第一个问题。请记住接受下面回答您问题的最佳答案。如果
sheets
是数组,则使用
sheets.forEach
和回调函数(而不是
for
循环),它将创建所需的闭包,以确保
sht
引用正确的内容。第一个问题@castoridae问得很好,但是,如果引用的是API或文档,请提供链接,所以我们在同一页上;谢谢:-)欢迎来到StackOverflow,祝贺你的第一个问题。记住接受下面回答你问题的最佳答案。