У меня есть простой код Google Apps Script, как этот:
function throwsError(){
var inboxThreads = GmailApp.getInboxThreads();
var sliceArr = inboxThreads.slice(0, 3);
Logger.log(sliceArr.length);
for each (var thread in sliceArr){
Logger.log(inboxThreads.containsThread(thread));
}
}
function doesNotThrowError(){
var inboxThreads = GmailApp.getInboxThreads();
var sliceArr = inboxThreads.slice(0, 3);
Logger.log(sliceArr.length);
for (var i = 0; i < sliceArr.length; i++){
Logger.log(inboxThreads.containsThread(sliceArr[i]));
}
}
Array.prototype.containsThread = function(thread){
Logger.log("Here");
Logger.log(thread);
return this.filter(function(t){ return t.getId() == thread.getId(); }).length > 0;
}
Как показывают имена функций, throwsError()
выдает ошибку TypeError: Cannot find function getId in object function (thread) {...}.
, doesNotThrowError()
работает без проблем. Единственная разница между ними заключается в том, что один использует цикл for
а другой - цикл.
Вывод журнала throwsError()
выглядит следующим образом:
Кажется, что в моем массиве sliceArr
есть только 3 элемента, но containsThread
вызывается 4 раза. (Кроме того, в четвертый раз кажется, что она передает функцию containsThread
в себя в качестве параметра). Есть идеи, что может быть причиной этого?
Я склоняюсь к тому, что это ошибка в Google Apps Script, но я хотел бы проверить здесь, есть ли у кого-то еще понимание. Обратите внимание, что Google Apps Script работает на JS 1.6 с некоторыми частями 1.7 и 1.8.
Всего 1 ответ
Не используйте для каждого
Из https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for_each...in
Оператор for each ... in считается устаревшим как часть стандарта ECMA-357 (E4X). Поддержка E4X была удалена. Попробуйте использовать для ... вместо.
Firefox теперь предупреждает об использовании для каждого ... in и больше не работает, начиная с Firefox 57.
Пожалуйста, ознакомьтесь с разделом Предупреждение: циклы JavaScript 1.6 for-each-in устарели для справки по миграции.