我想知道这是否是谷歌应用程序脚本(或整个javascript)或一个错误的功能。当我从循环内部调用函数时,我得到一个奇怪的结果。现在,在被调用函数中有一个循环,它使用与调用循环上运行的变量相同的变量,这似乎会导致问题。代码如下:
function dudi() {
var folderName='FormsGenerator';
var ss=new Array(2);
for(o=0;o<2;o++){
var str='dudo' + o;
trashFile(str,folderName);
ss[o]=SpreadsheetApp.create(str);
Logger.log(str);
}
}
function trashFile(fileName,folderName){
var folder=DocsList.getFolder(folderName);
var lFolder=folder.getFiles();
for(o=0;o < lFolder.length;o++){
if(lFolder[o].getName() == fileName) {
DocsList.getFileById(lFolder[o].getId()).setTrashed(true);
}
}
在第一次迭代后,调用函数中的循环停止。如果在trashFile中我将循环索引变量更改为“p”或使用“var o = 0”而不是“o = 0”,则问题就会消失。我究竟做错了什么?这是一个众所周知的功能还是一个错误?我已经用C和C ++编程了很长时间,但我对javascript / GAS很新。
最高
答案 0 :(得分:1)
现在,在被调用函数中,有一个循环使用与调用循环上运行的变量相同的变量,这似乎会导致问题。
问题的原因是o
未在任何一个函数中声明,因此您将成为The Horror of Implicit Globals的牺牲品:在JavaScript中,分配给不存在的变量会创建一个全局变量。 (有关详细信息,请参见下文。)由于o
最终成为全局变量,因此两个函数都使用相同的o
,并相互干扰。
只需在两个函数中声明o
(例如:var o;
),问题就会消失,因为每个函数都使用自己的局部变量而不是全局变量。
这种隐式全局变量是JavaScript原始设计的缺陷之一(所有语言都有设计缺陷)。他们在语言的新“严格”变体中解决了这个问题:如果启用严格模式,则分配给不存在的变量会导致错误而不是创建全局变量。
示例:(假设任何地方都没有a
的声明。)
松散模式:
function foo() {
a = "bar"; // <=== Creates a global variable called 'a'
}
严格模式:
function foo() {
"use strict";
a = "bar"; // <=== Throws a ReferenceError
}
您可以将严格模式应用于所有代码,方法是将其包含在作用域函数中:
(function() {
"use strict";
function foo() {
a = "bar"; // <=== Throws a ReferenceError
}
})();
您也可以将其放在script
标记中,方法是将其放在顶部:
<script>
"use strict";
function foo() {
a = "bar"; // <=== Throws a ReferenceError
}
</script>
这适用于内联脚本和上面的内容,以及通过src=
加载的.js文件。但要注意,如果你在.js文件的顶层执行此操作,则在组合脚本时必须小心! (这是我总是使用范围函数的一个原因;另一个原因是我不想创建任何全局变量。)