В то время как другие описали, почему это неверное поведение, они не предложили решение вашей проблемы. Хотя вам может не понадобиться решение, я все равно его предоставит.
Если вы хотите наблюдать коллекцию, которая отличается от коллекции, которую вы повторяете, вы должны вернуть новую коллекцию.
Например ..
IEnumerable<int> sequence = Enumerable.Range(0, 30);
IEnumerable<int> newSequence = new List<int>();
foreach (var item in sequence) {
if (item < 20) newSequence.Add(item);
}
// now work with newSequence
Вот как вы должны «изменять» коллекции. LINQ использует этот подход, если вы хотите изменить последовательность. Например:
var newSequence = sequence.Where(item => item < 20); // returns new sequence
Попытка
if (!window.console) console = ...
На неопределенную переменную нельзя ссылаться напрямую. Тем не мение,все глобальные переменные являются атрибутами с тем же именем глобального контекста ( window
в случае браузеров), и доступ к неопределенному атрибуту возможен.
Или используйте if (typeof console === 'undefined') console = ...
, если вы хотите избежать магической переменной window
, см. @Tim Down's ответ .
Другая альтернатива - оператор typeof
:
if (typeof console == "undefined") {
this.console = {log: function() {}};
}
Еще одна альтернатива - использование библиотеки протоколирования, например, моей собственной log4javascript.
В своих сценариях я либо использую сокращение:
window.console && console.log(...) // only log if the function exists
, либо, если невозможно или нецелесообразно редактировать каждую строку console.log, я создаю поддельную консоль:
// check to see if console exists. If not, create an empty object for it,
// then create and empty logging function which does nothing.
//
// REMEMBER: put this before any other console.log calls
!window.console && (window.console = {} && window.console.log = function () {});
Вы можете использовать console.log(...) непосредственно в Firefox, но не в IE. В IE вы должны использовать window.console.