2015-03-13 234 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(); 

此代码调用fu此时此刻还没有被读取的nction表达式。为什么这个工作?我一直认为只有函数声明可以在声明它们的行之前被调用。

这是因为它是一个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> 
+0

'纳秒的误差叫ns.initialize。 initialize'实际上并没有被称为 – 2015-03-13 17:25:59

+0

FYI,这个代码会在ES5严格模式下产生一个错误,因为'this'将会是'undefined'。 – JLRishe 2015-03-13 17:31:08

+0

我认为这是全局对象(窗口)在这里? – 2015-03-13 17:34:39

回答

0

因为我在这是CalculatorLibrary.js之后定义一个脚本这造成没有造成错误,当我提出这一段代码的CalculatorLibrary.js上我得到了我希望

2
var calculator = new ns.Calculator(); 

包含在ns.initialize函数中 - 也就是说,它不会得到评估,直到ns.initialize实际上被称为。在它被调用的时候,下面的代码,因此ns.Calculator = ...将会运行并且可用。

+0

我不明白:解析器第一次读取文件,看到iife并调用它,在iife内没有函数声明,因此ns.initialize和ns.Calculator都是未定义的。解析器开始执行代码并在initialize中跳转(在DOM负载中执行)并看到新的ns.undefined? – 2015-03-13 17:32:45

+0

'ns.initialize = function()...'是一个函数声明 - 它不会在您发布的代码中调用,其他的东西会调用它。直到这种情况发生,它才会运行内容。 – 2015-03-13 17:35:46

+0

@RobinHellemans我觉得你不理解javascript是如何在更基础的层面上工作的。将函数分配给变量时,该函数不运行该函数。在你的代码中没有发布你有'ns.initialize()'这就是实际运行功能 – 2015-03-13 17:36:12