这是一个自学成功的JS黑客,并且试图做得更正式一些,因为我必须构建一个更好的JS应用程序,这个应用程序是名称间隔的,并且是一个更好的JS公民。我很感激我在这里做错了一些指示。意外的IIFE执行顺序
这个想法是使用第一个闭包来构造一个名称空间,然后在第二个我添加一个方法'类'构造函数的名称空间对象。我在子上调用一个方法。
(function() {
'use strict';
/**
* @namespace ProjectX
*/
var ProjectX = {
attr1: 'I am inside ProjectX'
}
window.ProjectX = ProjectX;
})()
//console.log(ProjectX.attr1); // When this line is uncommented the code will output 'foobar' as expected?
(function() {
'use strict';
ProjectX.subObj = function(val) {
this.name = val;
return this;
};
})();
var subObj = new ProjectX.subObj('Foobar');
console.log(subObj.name);
我期待看到 'Foobar的' 在控制台日志。然而,这产生了在控制台下面的结果:
{ "message": "Uncaught TypeError: (intermediate value)(intermediate value)(intermediate value)(...) is not a function", "filename": " http://stacksnippets.net/js ", "lineno": 03, "colno": 1 }
当我读到这个代码,我希望这两个IIFE的将顺序执行,首先带来projectX创建于生活,那么,第二个加入进一步构造函数projectX创建该将返回一个subObj。此外,如果第16行的console.log((ProjectX.attr1)未经注释,代码将按照我预期运行。这似乎表明,在我引用它之前,ProjectX实体不是“存在”的。我对IIFE的理解是,它们立即运行,无论如何,ProjectX不是构造函数 - 它是一个全局变量。
在研究中,我发现function inside of IIFE not recognized这似乎是一个类似的领土,但与绑定一个事件DOM并不与我的查询相似
第一个IIFE后面缺少一个分号,当console.log及其分号被删除时变得相关。您可以搜索JS中需要分号的情况。另外,你可以尝试使用es6和babel来更好地组织你的代码并且具有更好的可读性。 – sabithpocker
谢谢@sabithpocker。Re ES6我必须覆盖目前常用的浏览器,我相信ES6还没有完全覆盖。 –
尝试[Babel](https://babeljs.io) – sabithpocker