Javascript 意外的IIFE执行序列

Javascript 意外的IIFE执行序列,javascript,iife,Javascript,Iife,我是一个自学成才的JS黑客,并试图变得更正式一点,因为我必须构建一个行为更好的JS应用程序,它的名字间隔更大,而且是一个更好的JS公民。我希望你能指点一下我做错了什么 其思想是使用第一个闭包来构造名称空间,然后在第二个闭包中,我向名称空间对象添加一个“类”构造函数。我在sub上调用一个方法 作用{ "严格使用",; /** *@namespace ProjectX */ var ProjectX={ 属性1:“我在ProjectX中” } window.ProjectX=ProjectX; }

我是一个自学成才的JS黑客,并试图变得更正式一点,因为我必须构建一个行为更好的JS应用程序,它的名字间隔更大,而且是一个更好的JS公民。我希望你能指点一下我做错了什么

其思想是使用第一个闭包来构造名称空间,然后在第二个闭包中,我向名称空间对象添加一个“类”构造函数。我在sub上调用一个方法

作用{ "严格使用",; /** *@namespace ProjectX */ var ProjectX={ 属性1:“我在ProjectX中” } window.ProjectX=ProjectX; } //console.logProjectX.attr1;//当这一行未注释时,代码将按预期输出“foobar”? 作用{ "严格使用",; ProjectX.subObj=functionval{ this.name=val; 归还这个; }; }; var subObj=newprojectx.subObj'Foobar';
console.logsubObj.name 您在第一个IIFE之后缺少一个分号,当删除带有分号的console.log时,该分号将变得相关。您可以搜索JS中需要分号的情况

如果没有分号,您的代码可以解释为:

(function() {
    var ProjectX = {
        attr1: 'I am inside ProjectX'
    }
    window.ProjectX = ProjectX;
})()(function() {
    ProjectX.subObj = function(val) {
        this.name = val;
        return this;
    };
})();
检查以下IIFE格式的函数,这是因为IIFE返回一个函数,该函数用“Hey”调用

作用{ 返回函数msg{console.logmsg}
}“嘿”您在第一个IIFE之后丢失了一个分号,当带有分号的console.log被删除时,这个分号就变得相关了。您可以搜索JS中需要分号的情况

如果没有分号,您的代码可以解释为:

(function() {
    var ProjectX = {
        attr1: 'I am inside ProjectX'
    }
    window.ProjectX = ProjectX;
})()(function() {
    ProjectX.subObj = function(val) {
        this.name = val;
        return this;
    };
})();
检查以下IIFE格式的函数,这是因为IIFE返回一个函数,该函数用“Hey”调用

作用{ 返回函数msg{console.logmsg}
}“嘿”您在第一个IIFE之后丢失了一个分号,当带有分号的console.log被删除时,这个分号就变得相关了。您可以搜索JS中需要分号的情况。此外,您可以尝试将es6与babel结合使用,以更好地组织代码并提高可读性。谢谢@sabithpocker。关于ES6,我必须介绍当前常见的浏览器,我相信ES6还没有完全涵盖。如果你想更新你的技能,那就尝试使用ES6模块,这样就不需要所有这些生活,也不用使用你自己的名称空间了。@VanquishedWombat Babel将ES6代码传输到es5中,因此兼容性没有问题。您可以编写es6中组织的代码,并部署传输es5版本。一旦所有浏览器都被覆盖,您就可以按原样发布es6并跳过传输。您在第一个IIFE之后缺少一个分号,当删除带有分号的console.log时,这个分号就变得相关了。您可以搜索JS中需要分号的情况。此外,您可以尝试将es6与babel结合使用,以更好地组织代码并提高可读性。谢谢@sabithpocker。关于ES6,我必须介绍当前常见的浏览器,我相信ES6还没有完全涵盖。如果你想更新你的技能,那就尝试使用ES6模块,这样就不需要所有这些生活,也不用使用你自己的名称空间了。@VanquishedWombat Babel将ES6代码传输到es5中,因此兼容性没有问题。您可以编写es6中组织的代码,并部署传输es5版本。一旦所有浏览器都被覆盖,你就可以按原样发布es6并跳过传输了?因此,在第二个生命之前,第一个生命没有被评估过,在第二个生命之前,没有定义ProjectX。对吗?不,那不对,它与定义ProjectX无关。myFunction的计算更像是从左到右,而不是从右到左。我将尝试更新答案,以包含更多细节。只是为了确认,JS将其视为从右向左解析的东西?因此,在第二个生命之前,第一个生命没有被评估过,在第二个生命之前,没有定义ProjectX。对吗?不,那不对,它与定义ProjectX无关。myFunction的计算更像是从左到右,而不是从右到左。我将尝试更新答案以包含更多细节。