对函数表达式和声明的混淆

Confusion about function expressions and declarations

所以当我偶然发现这段代码时,我正在阅读 Html5 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 并且它有一些我不知道的魔法吗?

编辑:

初始化在我的 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>
var calculator = new ns.Calculator();

包含在 ns.initialize 函数中 - 即在实际调用 ns.initialize 之前不会计算它。在它被调用时,以下代码,因此 ns.Calculator = ... 将具有 运行,并且可用。

因为我在 CalculatorLibrary.js 之后定义的脚本中调用 ns.initialize 这导致并没有导致错误,当我将这段代码移动到 [=11= 的顶部时] 我得到了我预期的错误