12

Stoyan Stefanov 在 JavasScript Patterns 中说:“您需要一个即时函数来将所有代码包装在其本地范围内,而不是将任何变量泄漏到全局范围内”第 70 页。

这是他的例子

(function() {
    var days = ['Sun','Mon'];
    // ...
    // ...
    alert(msg);
}());

但肯定因为 days 被定义为一个 var,它只是功能范围吗?立即函数的唯一好处是立即调用该函数。没有范围优势。正确吗?

4

8 回答 8

16

这与立即执行的功能与常规功能无关。事实上,它几乎没有关系。

立即调用的包装函数的唯一目的是限定包装函数的局部变量。

(function() {
    // This variable is only available within this function's scope
    var thisIsTemp = "a";

    // ...
}());

console.log(thisIsTemp); // undefined        

与:

// This variable is available globally
var thisIsTemp = "a";

// ...

console.log(thisIsTemp); // "a"
于 2012-11-13T16:15:53.327 回答
6

days变量放在函数范围内正是该示例的重点。如果没有立即调用的函数,所有变量 ( days, msg) 都将是全局变量,并且会污染全局命名空间。

于 2012-11-13T16:14:36.237 回答
6

从技术上讲这是正确的(没有作用域优势,因为该函数是即时的;一个普通的无聊函数也可以做到这一点),但不要忘记

  1. 你有一些你想现在运行的代码
  2. 您不希望该代码将名称泄漏到当前范围内

因此,该函数是因为 #2 而创建的,它也会因为 #1 而被立即调用。

于 2012-11-13T16:15:19.163 回答
1

“您需要一个立即函数将所有代码包装在其本地范围内,而不是将任何变量泄漏到全局范围内”

这不是真的。(或者至少是有争议的)

我认为 OP 的要求是,“您需要一个立即函数来创建本地范围还是可以只使用普通函数范围?” 我同意 OP 的观点,即函数和立即函数会将变量隐藏days在自己的范围内。要测试一个变量是否是全局的,(在控制台中)你可以检查它是否定义在window.

即时功能:

(function() {
    var days = ['Sun','Mon'];
    // ...
    // ...
    alert(msg);
}());
window.days; // undefined

正常功能:

var func = function() {
    var days = ['Sun','Mon'];
    // ...
    // ...
    alert(msg);
};
window.days; // undefined
Object.prototype.toString.call(window.func); // "[object Function]"

如您所见,days在这两种情况下都不是全局的。它在函数范围内是隐藏的或私有的。但是,在第二个示例中,我确实创建了一个全局变量。func但这证明您不需要立即函数来创建本地范围。

PS:我没看过这本书。我敢肯定作者很聪明,知道他们在说什么,但在这种情况下还不够具体。或者,也许我们需要更多关于引用的上下文来完全理解它。

于 2014-02-03T14:46:08.693 回答
0

在函数内部的想法var

不要将任何变量泄漏到全局范围

问题是,在这种情况下,天数在函数之外是不可见的,如果您尝试在控制台中编写,console.log(days)您将得到天数未定义

这样做是因为您永远不知道以后还有谁会使用您的代码,并且可能他会重新定义您的可变天数。

于 2012-11-13T16:16:27.200 回答
0

days仍然在函数的本地范围内。您在这里所做的是在本地范围内执行任务,以便您在该范围内定义的任何内容都不会污染全局名称空间。否则,您将在全局范围内拥有以下内容:

var days = ['Sun','Mon'];
// ...
// ...
alert(msg);
于 2012-11-13T16:16:58.697 回答
0

在 JavaScript 中,局部变量具有函数作用域,而不是块作用域。例如,在您发布的代码days中,实际上是函数的本地代码:

(function() {
  var days = ['Sun','Mon'];
  // ...
  // ...
  alert(msg);
}());

但是,如果您要在全球范围内说以下内容:

// ...
{ 
    var days = ['Sun','Mon'];
    // ...
    // ...
}
alert(msg);

days将成为全局变量(外部范围内的所有内容都可见),即使它是在块内定义的。那有意义吗?

于 2012-11-13T16:17:23.860 回答
0

我有同样的问题,
我认为立即函数的唯一好处是当我们使用匿名函数时它应该与匿名函数一起
使用,这意味着它永远不会被重用;没有名字你怎么能调用它?
所以让它作为一个即时功能更好。
作者没说清楚!

var func = function() {
var days = ['Sun','Mon'];
// ...
// ...
alert(msg);
func();

天数也在 func 的本地范围内,而不是全局变量

于 2014-05-26T03:32:03.097 回答