关于javascript:为什么使用自执行功能?

Why using self executing function?

本问题已经有最佳答案,请猛点这里访问。

在很多地方我看到这样的脚本:

1
2
3
4
(function () {
    var hello = 'Hello World';
    alert(hello);
})();

为什么不这样写,没有任何功能:

1
2
var hello = 'Hello World';
alert(hello);


我们使用自执行功能来管理变量范围。

变量的范围是程序中定义它的区域。
全局变量具有全局范围;它在JavaScript代码中随处定义。 (即使在你的功能中)。
另一方面,函数内声明的变量仅在函数体内定义。它们是局部变量并具有局部范围。函数参数也算作局部变量,并且仅在函数体内定义。

1
2
3
4
5
6
var scope ="global";
function checkscope() {
    alert(scope);
}

checkscope(); // global

如您所见,您可以访问函数内的scope变量,
但是,在函数体内,局部变量优先于具有相同名称的全局变量。如果声明一个与全局变量同名的局部变量或函数参数,则可以有效地隐藏全局变量。

1
2
3
4
5
6
7
8
var scope ="global";
function checkscope() {
    var scope ="local";
    alert(scope);
}

checkscope(); // local
alert(scope); // global

如您所见,函数内部的变量不会覆盖全局变量。
由于这个特性,我们把代码放在自执行函数中,
当我们的代码变得越来越大时,防止覆盖其他变量。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// thousand line of codes
// written a year ago

// now you want to add some peice of code
// and you don't know what you have done in the past
// just put the new code in the self executing function
// and don't worry about your variable names

(function () {
    var i = 'I';
    var can = 'CAN';
    var define = 'DEFINE';
    var variables = 'VARIABLES';
    var without = 'WITHOUT';
    var worries = 'WORRIES';

    var statement = [i, can, define, variables, without, worries];

    alert(statement.join(' '));
    // I CAN DEFINE VARIABLES WITHOUT WORRIES
}());
  • 您可以在本书中阅读有关JavaScript的更多信息:JavaScript:The Definitive Guide,第6版。

IIFE(立即调用的函数表达式)避免创建全局变量hello

还有其他用途,但对于您发布的示例代码,这就是原因。


除了保持全局命名空间干净之外,它们还可用于为可访问函数建立私有方法,同时仍然暴露一些属性供以后使用 -

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
var counter = (function(){
  var i = 0;

  return {
    get: function(){
      return i;
    },
    set: function( val ){
      i = val;
    },
    increment: function() {
      return ++i;
    }
  };
}());

// 'counter' is an object with properties, which in this case happen to be
// methods.

counter.get(); // 0
counter.set( 3 );
counter.increment(); // 4
counter.increment(); // 5


可能有几个原因。

第一个是保护范围,因为该函数创建了一个新范围。

例如,另一个可以是绑定变量

1
2
3
4
5
6
7
for (var i = 0; i < n; i++) {
   element.onclick = (function(i){
      return function(){
         // do something with i
     }
   })(i);
}