Какова область действия переменной счетчика в для цикла?

Я получаю следующую ошибку в Visual Studio 2008:

Ошибка 1 Локальная переменная с именем 'i' не может быть объявлена ​​в этой области видимости, поскольку она придала бы другое значение значению 'i', которое уже используется в области видимости 'child' для обозначения чего-то другого

Это мой код:

for (int i = 0; i < 3; i++)
{
  string str = "";
}

int i = 0; // scope error
string str = ""; // no scope error

Я понимаю что str перестает существовать после завершения цикла, но я также думал, что область действия i была ограничена для цикла .

Так i имеет ту же область видимости, что и переменная, объявленная сразу за пределами для цикла ?

Редактировать:

Просто для ясности, я использую C #. Я обсуждаю удаление тега "C". Однако, t JS будет неплохо, как ...

Вот кое-что, о чем я размышлял после бесчисленных часов, пытаясь настроить JS для кросс-браузерной совместимости (в основном IE): Почему не соответствует Javascript в разных браузерах?

Я имею в виду, почему JS не может быть таким хорошим, как Java и Flash? Вместо этого мы должны прибегнуть к таким фреймворкам, как jQuery. Не поймите меня неправильно, они делают мою жизнь проще - но почему они вообще существуют?

Есть ли для этого историческая причина? Компании, выпускающие браузеры, просто поставляют свой собственный движок JS? Какова политика, которая делает стандартизацию настолько трудной?

(Примечание: я понимаю, что значительная часть проблемы связана с DOM, но вопрос остается).

12
задан skaffman 30 June 2011 в 10:14
поделиться

4 ответа

Основной язык Javascript по большей части согласован (Ссылаясь на ECMAScript версии 3, выпущенной в 1999 г.)

Это реализации DOM которые вызывают головные боли. Отчасти потому, что в какой-то момент не было спецификации DOM, поэтому браузеры могли делать все, что они хотели, с точки зрения создания правил для доступа и управления элементами html на веб-странице.

Например:

  • window.addEventListener для браузеров, поддерживающих DOM, а window.attachEvent для IE.
  • textContent для браузеров, поддерживающих DOM, innerText для IE.
  • Утечка памяти для прикрепленных обработчиков событий в IE, поэтому их приходится выгружать вручную
  • getElementById содержит ошибки в IE и Opera, поскольку возвращает элементы по имени
  • getAttribute ('href') возвращает несовместимые значения

Есть также проблемы, связанные с поддержкой CSS браузером.

  • IE6 не поддерживает собственные PNG, поэтому вы вынуждены использовать библиотеку фильтров.
  • Ошибочная анимация в IE, связанная с непрозрачностью фильтра

Несогласованность ядра языка может быть такой же, как

  • Несоответствие между механизмами регулярных выражений

Но да, вкратце, дело в том, что раньше стандарта не было. С тех пор w3 разработал стандарты, но у каждого поставщика браузеров есть свои способы их реализации. Нет руководящего органа, который заставлял бы поставщиков полностью применять спецификацию.

16
ответ дан 2 December 2019 в 05:39
поделиться

Браузеры создают собственную реализацию, простую и понятную. По этой же причине рендеринг, CSS и все остальное в разных браузерах различаются. Java / Flash / и т. Д. являются более универсальными, потому что они абстрагируются от браузера и доступны через какой-то плагин. Но их фактические основные реализации отделены от браузера и контролируются одним поставщиком.

2
ответ дан 2 December 2019 в 05:39
поделиться

Компании, выпускающие браузеры, просто поставляют свой собственный JS-движок?

Да, это, вероятно, основная причина. Единого JS-движка не существует; есть различные реализации ECMAScript.

7
ответ дан 2 December 2019 в 05:39
поделиться

В дополнение к другим ответам: для этого есть историческая причина. Я могу написать это сам, но цитирование Википедии легче для пальцев:

JavaScript был первоначально разработан Бренданом Эйхом из Netscape под под названием Mocha, которое позже было переименовано в LiveScript, и, наконец, в JavaScript. LiveScript был официальным названием для языка, когда он впервые появился в бета-версии Netscape Navigator 2.0 в сентябре 1995 года, но он был переименован в JavaScript в совместном совместном объявлении с Sun Microsystems от 4 декабря 1995 года, когда он был развернут в браузере Netscape версии 2.0B3.

[...]

JavaScript очень быстро завоевал широкий успех в качестве клиентского язык сценариев для веб-страниц. В результате как следствие, Microsoft разработала совместимый диалект этого языка, назвав его JScript, чтобы избежать проблем с торговой маркой чтобы избежать проблем с торговой маркой. JScript добавил новые методы даты чтобы исправить несовместимые с Y2K методы в JavaScript, которые были основаны на java.util.Date. JScript был включен в Internet Explorer 3.0, выпущенный в августе 1996 года. Диалекты воспринимаются настолько похожими, что термины "JavaScript" и "JScript" часто используются как взаимозаменяемые. Microsoft, однако, отмечает десятки способов, с помощью которых JScript не соответствует требованиям ECMA.

В ноябре 1996 года компания Netscape объявила о том. что она представила JavaScript на рассмотрение Ecma International для рассмотрения в качестве промышленного стандарта, и последующая работа привела к появлению стандартизированной версии под названием ECMAScript.

Как видите, стандарт, ECMAScript, был разработан позже, чем оригинальный язык. Речь идет лишь об адаптации этого стандарта в текущих реализациях веб-браузеров, что продолжается до сих пор, как и разработка самого ECMAScript (например, см. спецификацию ECMAScript 5, опубликованную в декабре 2009 года).

2
ответ дан 2 December 2019 в 05:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: