Javascript google apps脚本循环变量是否要声明为var?

Javascript google apps脚本循环变量是否要声明为var?,javascript,google-apps-script,Javascript,Google Apps Script,我想知道这是谷歌应用程序脚本(或javascript作为一个整体)的一个功能还是一个bug。当我从循环内部调用函数时,会得到一个奇怪的结果。现在,在被调用的函数中有一个循环,它使用与调用循环中运行的变量相同的变量,这似乎会导致问题。代码如下: function dudi() { var folderName='FormsGenerator'; var ss=new Array(2); for(o=0;o<2;o++){ var str='dudo' + o;

我想知道这是谷歌应用程序脚本(或javascript作为一个整体)的一个功能还是一个bug。当我从循环内部调用函数时,会得到一个奇怪的结果。现在,在被调用的函数中有一个循环,它使用与调用循环中运行的变量相同的变量,这似乎会导致问题。代码如下:

 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);
     }
   }
函数dudi(){
var folderName='FormsGenerator';
var ss=新阵列(2);
对于(o=0;o
现在,在被调用的函数中有一个循环,它使用与调用循环中运行的变量相同的变量,这似乎会导致问题

问题的原因是,
o
在这两个函数中都没有声明,因此您可能会遇到这样的问题:在JavaScript中,分配给不存在的变量会创建一个全局变量(详见下文)由于
o
最终是一个全局变量,因此两个函数使用相同的
o
,并相互干扰

只需在两个函数中声明
o
(例如:
var o;
),问题就会消失,因为每个函数都使用自己的局部变量,而不是全局变量

这种隐式全局性的东西是JavaScript原始设计的缺陷之一(所有语言都有设计缺陷)。他们在语言的新“严格”变体中解决了这一问题:如果启用严格模式,分配给不存在的变量会导致错误,而不是创建全局变量

示例:(假设任何地方都没有
a
的声明。)

松散模式:

function foo() {
    a = "bar";    // <=== Creates a global variable called 'a'
}

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

非常感谢您的启发!我实际上是从James Ferrera的《谷歌脚本》和《谷歌开发者》页面中挑选了一些例子。在那里,我已经多次看到类似于(我在someList中){}Max:如果代码< > < /COD>未被声明为任何地方,是的,这将使它成为隐式全局(松散模式)。希望,<代码> > <代码>被声明在某个地方(也许在函数的顶部)。您提到过C++经验,所以我会警告您JavaScript没有。(目前)有块作用域、仅功能作用域、全局作用域和闭包。更多和(披露:都是指向我博客的链接)@TJCrowder,不幸的是,在GAS文档中有很多例子使用相同的方法idiom@Max:我既惊讶又不惊讶。可能是链接一?你确定他们没有在某处声明变量吗?例如
function foo() {
    "use strict";

    a = "bar";    // <=== Throws a ReferenceError
}
(function() {
    "use strict";

    function foo() {
        a = "bar";    // <=== Throws a ReferenceError
    }
})();
<script>
"use strict";
function foo() {
    a = "bar";    // <=== Throws a ReferenceError
}
</script>