2015-03-13 2 views
0

Так что я читал вверх Html 5 CSS учебное пособие на сертификат Microsoft, когда я наткнулся на этот кусок кода:Путаница функциональных выражений и деклараций

CalculatorLibrary.js

(function() { 

    this.calculatorNamespace = this.calculatorNamespace || {}; 
    var ns = this.calculatorNamespace; 

    ns.initialize = function() { 
     var calculator = new ns.Calculator(); 
     $("button[id^='btnNumber']").on('click', calculator.numberClick); 
     $('#btnPlus').on('click', calculator.plusClick); 
     $('#btnMinus').on('click', calculator.minusClick); 
     $('#btnClearEntry').on('click', calculator.clearEntry); 
     $('#btnClear').on('click', calculator.clear); 
     calculator.clear(); 
    }; 

    ns.Calculator = (function() { 

     function Calculator() { 

     } 

     //Some prototype code 

     return Calculator; 
    })(); 

})(); 

сейчас Я не понимаю, почему это не выдаст ошибку, когда разбирает достигает этой линии:

var calculator = new ns.Calculator(); 

этот код призывающую фу которое в данный момент еще не было прочитано. Почему это работает? Я всегда думал, что только объявления функций могут быть вызваны до строки, которую они объявили.

Это потому, что это IIFE, и у него есть какая-то магия, которая мне неизвестна?

EDIT:

инициализации вызывается, в моем index.html (нижняя часть тела):

<script src="../../../Exercise1Completed/WebCalculatorSolution/packages/jQuery.1.8.2/Content/Scripts/jquery-1.8.2.js"></script> 
    <script type="text/javascript" src="Scripts/CalculatorLibrary.js"></script> 
    <script type="text/javascript"> 
      $(function(){ 
       calculatorNamespace.initialize(); 
      }); 
     </script> 
+0

'нс. initialize' на самом деле не называется –

+0

FYI, этот код приведет к ошибке в строгом режиме ES5, потому что 'this' будет' undefined'. – JLRishe

+0

Я думал, что это глобальный объект (окно) здесь? –

ответ

0

Потому что я звонил ns.initialize в сценарий, который был определен после того, как CalculatorLibrary.js это вызвало не вызывает ошибку, когда я переехал этот кусок кода в верхней части CalculatorLibrary.js я получил ошибку я ожидал

2
var calculator = new ns.Calculator(); 

содержится в функции ns.initialize - то есть он не будет получить оценку до ns.initialize на самом деле называется. К тому времени, когда он вызывается, следующий код, и поэтому ns.Calculator = ... будет запущен и будет доступен.

+0

Я не понимаю: синтаксический анализатор читает файл в первый раз, видит iife и вызывает его, внутри iife нет объявлений функций, поэтому ns.initialize и ns.Calculator не определены. Парсер начинает выполнение кода и переходит в инициализацию (которая выполняется при загрузке DOM) и видит новый ns.undefined? –

+0

'ns.initialize = function() ...' _is_ объявление функции - оно не вызывается в коде, который вы отправили, что-то еще вызовет его. Дело не только в том, что оно запустит содержимое. –

+0

@RobinHellemans Я чувствую, что вы не понимаете, как работает javascript на более фундаментальном уровне. Когда вы назначаете функцию переменной, которая не запускает эту функцию. Нигде в вашем размещенном коде у вас есть 'ns.initialize()', что было бы для фактического запуска функции –

Смежные вопросы