Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/452.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 关于函数表达式和声明的混淆_Javascript_Iife - Fatal编程技术网

Javascript 关于函数表达式和声明的混淆

Javascript 关于函数表达式和声明的混淆,javascript,iife,Javascript,Iife,因此,我在阅读Microsoft证书的Html 5 CSS培训指南时偶然发现了以下代码: CalculatorLibrary.js (function () { this.calculatorNamespace = this.calculatorNamespace || {}; var ns = this.calculatorNamespace; ns.initialize = function () { var calculator = new ns

因此,我在阅读Microsoft证书的Html 5 CSS培训指南时偶然发现了以下代码:

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();
这段代码正在调用一个函数表达式,此时尚未读取该表达式。为什么这样做有效?我一直认为只有函数声明才能在声明它们的行之前被调用

这是因为这是一种生活,它有一些我不知道的魔力吗

编辑:

在my index.html(正文底部)中调用初始化:


$(函数(){
calculatorNamespace.initialize();
});

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

因为我在
CalculatorLibrary.js
之后定义的脚本中调用了
ns.initialize
,这并没有导致错误,当我将这段代码移到
CalculatorLibrary.js
的顶部时,我得到了我预期的错误
ns。initialize
实际上没有被调用。yi,这段代码在ES5严格模式下会产生错误,因为
将是
未定义的
。我以为这是全局对象(窗口)这里?我不明白:解析器第一次读取文件,看到iife并调用它,iife中没有函数声明,所以ns.initialize和ns.Calculator都是未定义的。解析器开始执行代码并跳入initialize(在DOM加载时执行),并看到新的ns。未定义?
ns.initialize=function()…
是一个函数声明-在您发布的代码中没有调用它,其他东西将调用它。直到这种情况发生,它才会运行内容。@RobinHellemans我觉得你还不了解javascript在更基本的层面上是如何工作的。将函数指定给变量时,该变量不会运行函数。在你发布的代码中没有任何地方有
ns.initialize()
这是实际运行函数所需要的。对不起,我没有意识到我没有添加代码,添加了它now@JamesThorpe哦,哇,我刚刚意识到我的错误,解析器将我的代码传递了两次,所有函数都已定义,只有到那时我的代码才会被调用,这是因为我是从这个脚本之后加载的另一个脚本执行的,这段代码正在工作,如果我从
CalculatorLibrary.j
s的开头调用initialize,这将导致我所预见的错误。虽然我仍然不明白如何
ns.initialize=function()是函数声明,而不是表达式
    <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();