JavaScript中自我执行函数的目的是什么?

在javascript中,你什么时候想使用它:

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

在此之上:

//Bunch of code...

答案 1

这一切都与变量范围有关。默认情况下,在自执行函数中声明的变量仅可用于自执行函数中的代码。这允许在编写代码时不考虑变量在其他 JavaScript 代码块中的命名方式。

例如,正如亚历山大在评论中提到的:

(function() {
  var foo = 3;
  console.log(foo);
})();

console.log(foo);

这将首先记录,然后在下一个上抛出错误,因为未定义。3console.logfoo


答案 2

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

var userName = "Sean";

console.log(name());

function name() {
  return userName;
}

但是,如果我在我的页面中包含一个非常方便的javascript库,它将高级字符转换为其基本级别表示形式,该怎么办?

等。。。什么?

我的意思是,如果有人输入一个带有某种口音的角色,但我只想要“英语”字符A-Z在我的程序中?井。。。西班牙语“ñ”和法语“é”字符可以翻译成“n”和“e”的基本字符。

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

一个问题:它有一个名为“name”的函数,与我的函数相同。

这就是所谓的碰撞。我们在同一作用域中声明了两个具有相同名称的函数。我们希望避免这种情况。

因此,我们需要以某种方式确定代码的范围。

在javascript中确定代码范围的唯一方法是将其包装在函数中:

function main() {
  // We are now in our own sound-proofed room and the 
  // character-converter library'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()函数。

现在我们来看看自动执行函数(或自执行,自运行,随便什么)。

((){})();

语法很尴尬,就像罪恶一样。但是,它有效。

当您将函数定义括在括号中,并包含参数列表(另一个集合或括号!)时,它充当函数调用

因此,让我们再次看一下我们的代码,使用一些自执行的语法:

(function main() {
  var userName = "Sean";
                
    console.log(name());
                
    function name() {
      return userName;
    }
  }
)();

因此,在您阅读的大多数教程中,您现在都会受到“匿名自我执行”或类似术语的轰炸。

经过多年的专业发展,我强烈建议您为调试目的而编写每个函数

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

非常冗长,我希望它有帮助!