JavaScript中的自动执行功能的目的是什么?

在JavaScript中,你想什么时候使用这个:

(function(){
    //Bunch of code...
})();

在此:

//Bunch of code...

其全部关于可变范围。 在自执行函数中声明的变量默认情况下仅适用于自执行函数内的代码。 这允许编写代码而不用担心变量在其他JavaScript代码块中的命名方式。

例如:

(function(){ 
    var foo = 3; 
    alert(foo); 
})(); 

alert(foo); 

这将首先提醒“3”,然后在下一次提醒时抛出一个错误,因为foo没有定义。


简单化。 所以看起来非常正常,几乎令人欣慰:

var userName = "Sean";

console.log(name());

function name() {
  return userName;
}

然而。 如果我在页面中包含一个非常方便的JavaScript库,可将高级字符转换为其基本级别表示,该怎么办?

等等......什么?

我的意思是。 如果某人输入某种口音的字符(例如法语或西班牙字符),但我只想要“英文”字符? Az在我的程序中? 嗯......西班牙语'n'和法国'e /'字符(我为这些字符分别使用了两个字符,但是您可以使用代表口音的字符进行心理跳跃),那些字符可以被翻译成'n'和'e'的基本字符。

所以有人很好的人写了一个全面的字符转换器,我可以包括在我的网站...我包括它。

一个问题:它有一个名为'name'的功能,与我的功能相同。

这就是所谓的碰撞。 我们有两个在相同范围内声明并具有相同名称的函数。 我们想要避免这种情况。

所以我们需要以某种方式限制我们的代码。

在javascript中范围代码的唯一方法是将其封装在一个函数中:

function main() {
  // We are now in our own sound-proofed room and the 
  // character-converter libarary's name() function can exist at the 
  // same time as ours. 

  var userName = "Sean";

  console.log(name());

  function name() {
    return userName;
  }
}

这可能会解决我们的问题。 现在所有内容都是封闭的,只能从我们的开启和关闭括号内进行访问。

我们在一个函数中有一个函数......这看起来很奇怪,但是完全合法。

只有一个问题。 我们的代码不起作用。 我们的userName变量永远不会回显到控制台!

我们可以通过在我们现有的代码块之后添加对函数的调用来解决此问题。

function main() {
  // We are now in our own sound-proofed room and the 
  // character-converter libarary's name() function can exist at the 
  // same time as ours. 

  var userName = "Sean";

  console.log(name());

  function name() {
    return userName;
  }
}

main();

或之前!

main();

function main() {
  // We are now in our own sound-proofed room and the 
  // character-converter libarary's name() function can exist at the 
  // same time as ours. 

  var userName = "Sean";

  console.log(name());

  function name() {
    return userName;
  }
}

次要担忧:名称“main”尚未使用的机会有多大? ......非常非常苗条。

我们需要更多的范围。 还有一些方法可以自动执行我们的main()函数。

现在我们来看看自动执行功能(或者自动执行,自动运行,不管)。

((){})();

这句话很尴尬,因为罪恶。 但是,它的工作。

当你用圆括号包装函数定义,并包含一个参数列表(另一组或括号!)时,它充当函数调用。

所以让我们再看看我们的代码,用一些自动执行的语法:

(function main() {
  var userName = "Sean";

    console.log(name());

    function name() {
      return userName;
    }
  }
)();

所以,在你阅读的大多数教程中,你现在会被'匿名自执行'或类似的东西轰炸。

经过多年的专业发展,我强烈建议您将所编写的每个功能都命名为调试目的。

当出现问题(并且会出现问题)时,您将在浏览器中检查回溯。 当堆栈跟踪中的条目具有名称时,缩小代码问题总是更容易!

巨大的啰嗦,我希望它有帮助!


自我调用(也称为自动调用)是函数在定义时立即执行的时间。 这是一个核心模式,并且是许多其他JavaScript开发模式的基础。

我是一个很棒的粉丝:)因为:

  • 它将代码保持在最低限度
  • 它强制将表现与行为分离
  • 它提供了一个阻止命名冲突的关闭
  • 巨大 - (为什么你应该说它的好处?)

  • 它是关于一次定义和执行一个功能的。
  • 您可以让该自执行函数返回一个值并将该函数作为参数传递给另一个函数。
  • 这对封装很好。
  • 这对块的范围界定也很有用。
  • 是的,你可以把所有的.js文件放在一个自动执行的函数中,并且可以防止全局命名空间污染。 ;)
  • 更多在这里。

    链接地址: http://www.djcxy.com/p/96889.html

    上一篇: What is the purpose of a self executing function in javascript?

    下一篇: What does "!function () {}" mean/do in javascript?