gpt4 book ai didi

javascript - 谷歌应用程序脚本循环变量被声明为var?

转载 作者:行者123 更新时间:2023-11-30 05:44:34 24 4
gpt4 key购买 nike

我想知道这是谷歌应用程序脚本(或就此而言作为一个整体的 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 还很陌生。

最大

最佳答案

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.

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

关于javascript - 谷歌应用程序脚本循环变量被声明为var?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18714455/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com