即时函数JavaScript
Stoyan Stefanov在JavasScript Patterns中说:“您需要一个直接函数将所有代码包装在其局部范围内,而不将任何变量泄漏到全局范围内。”第70页 这是他的例子即时函数JavaScript,javascript,function,iife,Javascript,Function,Iife,Stoyan Stefanov在JavasScript Patterns中说:“您需要一个直接函数将所有代码包装在其局部范围内,而不将任何变量泄漏到全局范围内。”第70页 这是他的例子 (function() { var days = ['Sun','Mon']; // ... // ... alert(msg); }()); 但肯定是因为days被定义为一个var,所以它只是一个功能范围?立即函数的唯一好处是可以立即调用该函数。没有范围优势。correct?在
(function() {
var days = ['Sun','Mon'];
// ...
// ...
alert(msg);
}());
但肯定是因为days被定义为一个var,所以它只是一个功能范围?立即函数的唯一好处是可以立即调用该函数。没有范围优势。correct?在函数范围中包含您的
days
变量正是示例所要说明的要点。如果没有立即调用的函数,所有变量(days
,msg
)都将是全局变量,并且会污染全局名称空间。从技术上讲,这是正确的(因为函数是立即调用的,所以没有作用域好处;普通的无聊函数也会这样做),但不要忘记这一点
因此,函数是因为#2而创建的,但它也是因为#1而立即调用的。它不是关于立即执行的函数与常规函数的比较;事实上,它几乎没有什么关系 立即调用的包装函数的唯一目的是作用于包装函数的局部变量
(function() {
// This variable is only available within this function's scope
var thisIsTemp = "a";
// ...
}());
console.log(thisIsTemp); // undefined
vs:
var
在函数内部的思想是
不向全局范围泄漏任何变量
在这种情况下,天在函数外部是不可见的,如果您尝试在控制台console.log(days)
中写入,您将得到未定义的天
之所以这样做,是因为您永远不知道以后还会有谁在使用您的代码,而且他可能会重新定义您的可变天数。
days
仍在函数的本地范围内。这里要做的是在本地范围内执行任务,以便在该范围内定义的任何内容都不会污染全局命名空间。否则,您将在全局范围内具有以下内容:
var days = ['Sun','Mon'];
// ...
// ...
alert(msg);
// ...
{
var days = ['Sun','Mon'];
// ...
// ...
}
alert(msg);
在JavaScript中,局部变量具有函数作用域,而不是块作用域。例如,在您发布的代码中,
days
实际上是函数的本地部分:
(function() {
var days = ['Sun','Mon'];
// ...
// ...
alert(msg);
}());
但如果你在全球范围内说:
var days = ['Sun','Mon'];
// ...
// ...
alert(msg);
// ...
{
var days = ['Sun','Mon'];
// ...
// ...
}
alert(msg);
days
将成为一个全局变量(外部范围内的所有对象都可见),即使它是在块内定义的。这有意义吗
“您需要一个立即函数将所有代码包装在其局部作用域中,而不将任何变量泄漏到全局作用域”
事实并非如此。(或者至少是有争议的)
我认为OP所问的是,“你需要一个立即函数来创建局部作用域,还是只使用普通的函数作用域?”我同意OP的观点,即函数和立即函数将把变量days
隐藏在它自己的作用域中。要测试变量是否为全局变量,(在控制台中),您可以检查它是否在窗口中定义
即时功能:
正常功能:
如您所见,days
在这两种情况下都不是全局的。它在功能范围内是隐藏的或私有的。但是,在第二个示例中,我确实创建了一个全局的func
。但这证明了您不需要立即函数来创建局部作用域
附言:我从未读过这本书。我相信作者是聪明的,知道他们在说什么,但在这个确切的案例中不够具体。或者,我们需要更多的上下文来完全理解报价。我也有同样的问题
我认为立即函数的唯一好处是它应该与匿名函数一起使用
当我们使用匿名函数时,这意味着它永远不会被重用;没有名字你怎么能调用它?
因此,将其作为一种即时功能变得更好。
作者没有说清楚
var func = function() {
var days = ['Sun','Mon'];
// ...
// ...
alert(msg);
func();
天数也在func的局部范围内,而不是全局变量,并且您不会看到外部变量,如果它不在上面的闭包内,它将是全局变量。(范围将是窗口,即,与在没有var
的情况下声明它相同)不确定我是否得到了您的要求…不,正如您所说的days
将在函数范围内,而不是全局范围内。这就是范围优势。我知道你对他的评论的理解是错误的。这并不是说你的代码有很多优点(虽然有,但这不是重点)。主要原因是,同一站点上的其他Javascript将有一个额外的保护层,以防止您犯下的任何错误。什么?如果在函数中使用var
定义days
将如何在全局范围内?请尝试重新阅读我的答案。如果没有立即调用的函数,变量将是全局的。@lanzz Uggh,对不起,我读得太快了。我错了!我以为您是在暗示,如果没有立即调用,函数中的所有内容都将在全局范围内。阅读理解失败。我认为这是最好的答案。它不是直接封闭函数与普通封闭函数的比较。它是直接函数,而不是完全没有封闭函数。只是普通的JavaScript。
var func = function() {
var days = ['Sun','Mon'];
// ...
// ...
alert(msg);
func();