我正试图把我的脑袋包裹起来(那里有一个笑话)我跑过去:
(function () { /* do cool stuff */ })();
这是如何运作的?将功能放入parens的目的是什么?之后为什么空荡荡的?
这一点是,在酷的东西中声明的任何变量都不会在全局命名空间中创建.javascript中的任何函数都将创建这样的范围.假设您有一些想要运行的JavaScript.如果你这样做:
var b = 1; // stuff using b
而其他一些代码使用b,它会让你的剩余价值.(或者,更糟糕的是,如果某些其他代码在代码运行之前设置了b,那么稍后尝试获取其旧值,那么在此期间您已经更改了它.)
另一方面,如果你有这个代码,它声明然后调用一个函数:
function a() { var b = 1; } a();
稍后一些其他代码使用b,它将看不到您的值,因为b是函数的本地代码.当然,问题在于你仍然在创建一个全局名称 - 在这种情况下是"a".所以,我们想要一个没有名字的函数 - 这就是你得到你描述的代码的原因.它声明了一个没有名称的函数,然后调用它.
不幸的是,你不能只说:
function() { ... }()
因为这将被解析为函数声明语句,然后是语法错误.通过将函数声明包装在括号中,您将获得一个函数表达式,然后可以调用该表达式.您可以像使用第二组parens一样将其称为任何其他函数表达式(如上图所示).例如,如果函数接受了参数,那么你将它们传递给那里:
(function(a) { ... })(1)
这会创建一个函数,调用它并丢弃它.
如果你这样看它可能会更清楚:
var throwaway = function(){ // do cool stuff }; throwaway();
这样做是为了创建一个私有命名空间.函数中的代码可以包含函数和变量,而不必担心与页面中加载的其他代码冲突.