Javascript 关于函数表达式和声明的混淆
因此,我在阅读Microsoft证书的Html 5 CSS培训指南时偶然发现了以下代码: CalculatorLibrary.jsJavascript 关于函数表达式和声明的混淆,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
(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();