函数按值返回函数

时间:2017-07-21 23:05:00

标签: javascript function reference google-sheets

我正在尝试根据某些条件使用Google Script(JavaScript)添加指向Google表格中菜单的链接。添加菜单项的Google's API template如下:

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

这会为每个名为({1}},gotoSheet1menu()gotoSheet2menu()的工作表创建一组函数。但是,当我调用任何函数时,它们都会激活最后一页。例如,如果我调用gotoSheet3menu(),它会激活Sheet3。我认为这是由于gotoSheet1menu()ss通过引用传递而不是通过值传递。有办法解决这个问题吗?

2 个答案:

答案 0 :(得分:0)

createGotoMenuFunctions闭包将保留sht的一个副本,这是最后一个表,因为它在结尾处声明。当函数执行时,它将无法在自己的闭包中找到sht,并将接近封闭它的闭包。所以它会得到sht(最后一页复印件)。

要获得正确答案,您应该在功能之后使用绑定:

scope[funcName].bind({sht: sheets[s]})

答案 1 :(得分:0)

这也是一种将sht绑定到闭包的方法:

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

(见这个问题,它类似:javascript closure immediate evaluation