2

これがGoogle Appsスクリプト(または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" に変更するか、"o=0" の代わりに "var o=0" を使用すると、問題は解決します。私は何を間違っていますか?これはよく知られた機能ですか、それともバグですか? 私は長い間 C と C++ でプログラミングを行ってきましたが、javascript/GAS についてはまったくの初心者です。

マックス

4

1 に答える 1

1

現在、呼び出された関数内に、呼び出しループで実行されている変数と同じ変数を使用するループがあり、これが問題を引き起こしているようです。

問題の理由は、どちらの関数でも宣言されていないため、暗黙のグローバルの恐怖のo餌食になっていることです: JavaScript では、存在しない変数に代入すると、グローバル変数が作成されます。(詳細については以下を参照してください。) 最終的にはグローバル変数になるため、両方の関数が同じを使用し、互いに干渉します。oo

両方の関数内で宣言するだけoで (例: var o;)、問題は解消されます。これは、各関数がグローバルではなく独自のローカル変数を使用するためです。

この暗黙のグローバル化は、JavaScript の元の設計の欠陥の 1 つです (すべての言語には設計上の欠陥があります)。彼らは、この言語の新しい「厳密な」バリアントでこれに対処しました。厳密モードを有効にすると、グローバルを作成するのではなく、存在しない変数に代入するとエラーが発生します。

例: (どこにも宣言がないものとし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 ファイルの最上位で行う場合は、スクリプトを組み合わせるときに注意が必要です。(これが、私が常にスコープ関数を使用する 1 つの理由です。もう 1 つは、グローバルを作成したくないということです。)

于 2013-09-10T08:53:16.103 に答える