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