关于函数表达式和声明的困惑

时间:2015-03-13 17:23:57

标签: javascript iife

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

编辑:

初始化在我的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>

2 个答案:

答案 0 :(得分:2)

var calculator = new ns.Calculator();

包含在ns.initialize函数中 - 即在实际调用ns.initialize之前不会对其进行评估。在调用它时,以下代码,因此ns.Calculator = ...将运行,并且可用。

答案 1 :(得分:0)

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