Javascript 为什么要给变量赋值?

Javascript 为什么要给变量赋值?,javascript,angularjs,Javascript,Angularjs,我一直在JavaScript和AngularJS中使用iLife,并一直在使用以下结构: 方法1: //IIFE Immediately Invoked Function Expression (function () { }()); //IIFE Immediately Invoked Function Expression assigned to doStuff variable var doStuff = (function () { }()); 然而,我经常看到以下情况,其中

我一直在
JavaScript
AngularJS
中使用iLife,并一直在使用以下结构:

方法1:

//IIFE Immediately Invoked Function Expression
(function () {


}());
//IIFE Immediately Invoked Function Expression assigned to doStuff variable
var doStuff = (function () {


}());
然而,我经常看到以下情况,其中变量被分配给
IIFE

方法2:

//IIFE Immediately Invoked Function Expression
(function () {


}());
//IIFE Immediately Invoked Function Expression assigned to doStuff variable
var doStuff = (function () {


}());
注意:这个问题不是关于这个模式是什么或一种生活是什么的。这是关于为什么人们会在IIFE上使用返回变量,以及它与角度实践的关系

在Angular中,方法1可以很好地工作,但在我看到的许多原始JS示例中,使用了方法2。我的假设是,任何封装在
doStuff
中的东西都可以通过它进行访问和调用。但是,我不能100%确定这两种方法之间的确切推理或区别,需要一些帮助来理解何时使用不同的方法?

方法#2的原因是,您会在IIFE中找到返回某些内容的代码(通常,但不一定是对象或函数)。生命的回报就是最终被分配的东西。例如:

//IIFE Immediately Invoked Function Expression assigned to doStuff variable
var doStuff = (function () {
    var privateInformationForDoStuff = 0;

    function doStuff() {
        console.log(++privateInformationForDoStuff);
    }

    return doStuff;
}());
在这里,变量最终是一个函数的引用,每次调用它时,它都会给我们一个比前一次高的数字。IIFE是为了确保没有任何东西可以修改
privateInformationForDoStuff
变量,它对
doStuff
函数是完全私有的

这种方法的常见用途是创建具有各种功能的对象,有时称为模块,其中可能还包含仅在“模块”中共享的私有信息:


这很有帮助,谢谢。我认为这个差距就是为什么
AngularJS
不需要为为控制器、服务、,等等。我认为它不需要它们的原因是因为在
IIFE
内部,代码通过
ng app
指令使用角度模块容器注册自身,从而允许访问从
IIFE
返回的所有内容,而无需使用返回变量。你知道这是一个真实的解释吗?@atconway:可能吧。你可以看到IIFE在非角度代码中也不返回值。例如,这里是我常用的polyfill,用于那些本机没有
String#trim
的浏览器(当然,它通常是更大的东西的一部分)。通过你在上面的例子,我假设变量
doStuff
myApp
将用于同一个.js文件中引用,而不是用于其他文件?或者,在多个.js文件中公开使用这些返回变量是常见的做法吗?@atconway:如果上面的代码是全局范围的,那么这些将是全局变量,因此可以由同一窗口中加载的其他JavaScript使用。如果上面的代码不在全局范围内,则它们不是全局的,因此它们可能不在全局范围内。我尽量避免在代码中创建任何全局变量;您可能会看到各种AMD(异步模块定义)机制,用于加载相互依赖的多个脚本。好吧,我想现在有一些灯泡亮了起来-在
AngularJS
中,连接
IIFE
s的“粘合剂”是框架本身和与之相关的模块。在原始JS中,“胶水”是通过全局脚本标记提供访问(如果需要)。还有一些替代方法,如
AMD
,可以清除依赖项,并提供多种方式为每个文件或全局公开的值提供“粘合”。通过定义它们之间的关系。@Bergi-这不是重复的-请阅读问题,并查看与假定重复的链接的区别。这个链接不能回答这个问题。我不确定我是否理解这个问题。你似乎知道一个人的生活是什么;现在为什么要用生活的回报呢?每当需要从表达式中返回
以将值赋给
doStuff
;而不是执行一个无效的生命。如果你在寻找用例,你应该在谷歌上搜索“模块模式”,因为这就是具有返回值的IIFE的名称。@Bergi-我相信你刚才发表的评论实际上是对我发表的内容和我将称之为“答案”的一个很好的解释。如果你是开放的,并张贴作为一个答案,我会投票。不要忘记,仅仅因为某些事情对你来说是显而易见的,并不意味着它对OP(我)来说是显而易见的。也因为这显然不是关闭的理由。我需要具体的例子和解释为什么返回变量与不使用返回变量相比。在
Angular
中,它们并不总是有返回变量,但许多JS示例都使用返回。我想知道并理解“为什么”。这是我第二次看到“生命伤害理解”这个名字。如果我们使用它的旧/传统名称“自调用函数”来调用这个设计模式,那么为什么有些被分配给变量,有些没有分配给变量,这一点就不神秘了:因为函数就是这样做的。有些函数返回您使用的值,有些函数不返回。如果人们坚持认为自调用函数是错误的,那么至少要立即调用它调用函数表达式。不要称之为IIFE——人们忘记了IIFE没有什么特别/神奇的——它们只是函数。@slebetman——我想我试图从
角度
的角度来理解为什么我们可以使用void return
IIFE
s,但仍然可以返回和使用公共可用的函数?我想验证一下,在
IIFE
中包装控制器的
Angular
模块容器是我们仍然可以访问
IIFE
中那些本身不包含返回变量的函数的原因。但是,控制器本身确实有一个返回变量,并且在使用
app.controller
时将其注册。