关于JavaScript中的匿名函数

5

我是一个刚接触 JavaScript 的初学者,但我有深入的 C#、Java、C++ 等面向对象编程语言的背景......在 JavaScript 中有一个叫做匿名函数的概念。以下是一段示例代码:

(   function() { 
      for(var x = 0;x<5;x++) {
         console.log(x); 
      } 
   })(); 

我理解到末尾的括号是让函数调用自身。还有另一种语法也可以实现相同的功能:

var x =   function() { 
      for(var x = 0;x<5;x++) {
         console.log(x); 
      } 
   }(); 

但是现在如果我尝试使用x,它不会再次执行该函数。那么第二个版本中使用赋值的目标是什么?我能再次通过x使用该函数吗?


2
由于您在函数后面加上了 (),它会立即调用该函数并分配其返回值(在您的情况下为 undefined)。移除 () 并且如果您想要立即调用它,请在下一行进行调用,例如:x(); - Rajesh
1
请注意,JavaScript不是面向对象的语言。相反,JS是基于原型的语言,其中会有一些令您惊讶的事情。 - Derek 朕會功夫
2
为什么有人踩了这个问题?对于初学者来说,这是一个好问题。 - Luke
第一个没有var x = 的实际上是一个IIFE https://dev59.com/QGsy5IYBdhLWcg3w6yUN - Niladri
1
变量x是调用匿名函数的结果...在这种情况下...由于它没有返回值,因此为undefined - Jaromanda X
3个回答

5
自执行函数被称为IIFE(立即调用函数表达式),它通常用于控制作用域,以避免出现大量的全局变量。
例如,这个函数就像一个储钱罐,封装了所有“钱”的信息,因此您只能插入或获取总金额,但不能直接调用add/get并访问变量。
它也可以作为OOP的一种形式使用,因为您已经非常熟悉它。

var myMoneyBox = (function() {
    var money = 0;

    function addMoney(x) {
        if (x > 0)
            money += x;
    }

    function getMoney() {
        return money;
    }

    return {
        add: addMoney,
        get: getMoney
    }
})();

myMoneyBox.add(10);
console.log(myMoneyBox.get());


非常感谢,这使得概念更加清晰。 - Code Pope

2

x被赋值为你的函数的结果,就像在任何其他表达式x = f()中一样,你只需在表达式内定义f。它没有返回值,所以在这种情况下x的值是undefined

如果你想使用x调用函数,那么就不要在表达式末尾添加()...


可能是有主观色彩的评论,但这应该是一个注释。 - Rajesh
5
评论用来询问澄清问题,这是一个实际的回答。你的意思是答案非常简单,所以这本不应该成为一个问题,我同意这一点。 - RemcoGerlich
如果您认为这不应该是在这里提出的问题,那么当我有这个问题时,我应该在哪里提问呢?(顺便说一句,感谢您的答案,现在很清楚了) - Code Pope
1
@CodePope:稍微在浏览器控制台中自己玩弄代码会更好,这样就不用太费力了。但我一直在拖延时间,而你的问题又放在最上面:-)有趣的是,获得高票并被采纳的答案完全忽略了你的问题,解释了其他事情。 - RemcoGerlich
1
@Rajesh:每当我过于严肃地看待风险时,我就会想起我的最高票答案是什么(https://dev59.com/jmAg5IYBdhLWcg3w9e0y#22988680),然后我只能笑...... - RemcoGerlich

2
我认为这可能会对你有所帮助:

var x =   function() { 
      for(var x = 0;x<5;x++) {
         console.log(x); 
      } 
   }; 
x();


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接