Создает ли IE новую область для каждого тэга script?

Почему следующий HTML файл показывает название по умолчанию в IE? Другие браузеры показывают название как mytitle.

<script>
window.mylib = window.mylib || {};
mylib.title = 'mytitle';
</script>

<script>
var mylib = mylib || {};
document.title = mylib.title || 'default';
</script>

Создает ли IE отдельную область для каждого из тегов script?

И это просто ошибка или почему поведение отличается?

(тестируется в IE8 и последней версии chrome/ff/opera)

Ответы

Ответ 1

HTML <script> теги Javascript выполняются в области window. Таким образом, выделенные теги script выполняются в той же области.

В частности, с IE7, попробуйте не переопределять переменную во второй раз:

Вместо

var mylib = mylib || {};

использовать

mylib = window.mylib || {};

IE7, вероятно, перезаписывает определение mylib, когда встречается var mylib.

Ответ 2

Сфера применения не должна быть проблемой. Каждый <script> должен оцениваться в пределах одной и той же глобальной области.

Однако window.mylib = ... не считается фактическим объявлением в IE8. Итак, после него с var mylib вызывает переопределение /reset до undefined.

<script>
  window.mylib = {};
</script>

<script>
  console.log(typeof window.mylib); // object
</script>

<script>
  var mylib;
  console.log(typeof window.mylib); // undefined
</script>

Он должен работать как ожидалось при использовании var mylib или window.mylib. Кажется, что это просто проблема.

<script>
  var mylib = mylib || {};
  mylib.title = 'mytitle';
</script>

<script>
  var mylib = mylib || {};
  document.title = mylib.title || 'default'; // 'mytitle'
</script>

Ответ 3

Вы инициализируете window.mylib в первом теге <script>. Во втором теге <script> вы инициализируете var mylib с помощью mylib not window.mylib. А затем проверьте значение title на это. Кажется, некоторые логические проблемы, если я могу понять это правильно.

<script> привязаны к окну, поэтому не имеет значения, сколько у вас есть и в какой из них вы обращаетесь к переменным или функциям, если они правильно определены и/или инициализированы.