2

I am wondering if this is a feature of google apps script (or javascript as a whole for that matter) or a bug. I get a strange result when I call a function from inside a loop. Now, within the called function there is a loop that uses the same variable that the variable running on the calling loop and this seems to cause a problem. Here the code:

 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);
     }
   }

What happens is that the loop in the calling function stops after the first iteration. If in trashFile I change the loop index variable to "p" or I use a "var o=0" instead of a "o=0", the problem goes away. What am I doing wrong? Is this a well known feature or a bug? I have been programming in C and C++ for long years, but I am fairly new with javascript/GAS.

Max

4

1 回答 1

1

现在,在被调用函数中有一个循环使用与调用循环上运行的变量相同的变量,这似乎会导致问题。

问题的原因o是没有在任何一个函数中声明,所以你陷入了隐式全局的恐怖:在 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>

这既适用于上述内联脚本,也适用于您通过 .js 加载的 .js 文件src=。但请注意,如果您在 .js 文件的顶层执行此操作,则在组合脚本时必须小心!(这是我总是使用作用域函数的一个原因;另一个是我不想创建任何全局变量。)

于 2013-09-10T08:53:16.103 回答