google apps脚本循环变量要声明为var吗?

时间:2013-09-10 08:50:51

标签: javascript google-apps-script

我想知道这是否是谷歌应用程序脚本(或整个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很新。

最高

1 个答案:

答案 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文件的顶层执行此操作,则在组合脚本时必须小心! (这是我总是使用范围函数的一个原因;另一个原因是我不想创建任何全局变量。)