Путание операции ключевого слова 'var' JavaScript

Я столкнулся с очень странным (мне) проблема с var ключевое слово. Я уменьшил его до довольно минимального тестового сценария и нашел, что это показано в Node.js (таким образом, V8 и Chrome), Safari 4 инспектор (таким образом, Нитро), и FireBug (очевидно, SpiderMonkey). Я первоначально готовил отчет об ошибках, но так как он так широко отображен, я собираюсь предположить, что я полностью неправильно понимаю, как JavaScript, как предполагается, определяет объем и ищет переменные.

Тестовый сценарий является очень небольшим, и на GitHub здесь: http://gist.github.com/260067. Единственной разницей между первым и вторым примером является включение var ключевое слово.

Здесь, также, подобный тестовый сценарий, который показывает ту же 'проблему' по-другому: https://gist.github.com/698b977ee0de2f0ee54a

Править: Для устранения больше ответов, пытающихся объяснить, как расположение каскадом определяет объем работ, я глубоко знаком с этим. Моя проблема, то, что я не понимаю, почему следующий код 'работает' (в этом это alert()s 'внешний', сопровождаемый 'внутренним', и с другой стороны 'внешний'):

(function(){
  var foo = 'outer';
  alert("Outer `foo`: " + foo);

  (function(){
    foo = 'inner';
    alert("Inner `foo`: " + foo);

    var foo;
  })();

  alert("Outer `foo`: " + foo);
})();

var foo; происходит в абсолютно несоответствующем положении с re‐assignment foo; итак, почему это влияет на то присвоение очень существенным способом?

6
задан 3 revs 19 December 2009 в 14:12
поделиться