Javascript 按值返回函数的函数
我试图根据一些标准,使用谷歌脚本(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
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,祝贺你的第一个问题。记住接受下面回答你问题的最佳答案。