Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/416.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么要使用自动执行功能?_Javascript_Function - Fatal编程技术网

Javascript 为什么要使用自动执行功能?

Javascript 为什么要使用自动执行功能?,javascript,function,Javascript,Function,在许多地方,我看到这样的脚本: (function () { var hello = 'Hello World'; alert(hello); })(); 为什么不这样写,没有任何功能: var hello = 'Hello World'; alert(hello); (立即调用的函数表达式)避免创建全局变量hello 还有其他用途,但对于您发布的示例代码,这就是原因。除了保持全局名称空间干净外,它们还可用于为可访问函数建立私有方法,同时还可公开一些属性供以后使用- var

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

(function () {
    var hello = 'Hello World';
    alert(hello);
})();
为什么不这样写,没有任何功能:

var hello = 'Hello World';
alert(hello);
(立即调用的函数表达式)避免创建全局变量
hello


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

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

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

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

// 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代码中的任何地方都有定义。(即使在您的函数中也是如此。 另一方面,函数中声明的变量仅在函数体中定义。它们是局部变量,具有局部作用域。函数参数也算作局部变量,仅在函数体中定义

var scope = "global";
function checkscope() {
    alert(scope);
}

checkscope(); // global
如您所见,您可以访问函数中的
范围
变量, 但是,在函数体中,局部变量优先于具有相同名称的全局变量。如果使用与全局变量相同的名称声明局部变量或函数参数,则可以有效地隐藏全局变量

var scope = "global";
function checkscope() {
    var scope = "local";
    alert(scope);
}

checkscope(); // local
alert(scope); // global
如您所见,函数中的变量不会覆盖全局变量。 由于这个特性,我们将代码放在自执行函数中, 为了防止覆盖其他变量,当我们的代码越来越大时,

// 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的内容:

    • 可能有两个原因

      第一个是保护作用域,因为函数创建了一个新的作用域

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

      for (var i = 0; i < n; i++) {
         element.onclick = (function(i){
            return function(){
               // do something with i
           }
         })(i);
      }
      
      (变量i=0;i{ element.onclick=(函数(i){ 返回函数(){ //和我一起做点什么 } })(i) ); }
      保持全局命名空间干净是一个明确的原因,从而减少冲突的机会。在此基础上进行扩展。iLife对于创建自定义名称空间也很有用,它将是上述功能的“扩展”。是否可以使用它来封装整个web应用程序的启动?如果是这样的话,它将是一种分离全局名称空间的极好方法。但在这一点上我的问题是,如何使用它使所需的实体持久化?我是否必须通过关闭来实现这一点?我不认为这些是私人的方法。你可以访问它们。