javascript中自动执行函数的用途是什么?

javascript中自动执行函数的用途是什么?,javascript,closures,iife,self-executing-function,Javascript,Closures,Iife,Self Executing Function,在javascript中,您希望何时使用此选项: (function(){ //Bunch of code... })(); 在这方面: //Bunch of code... 名称空间。JavaScript的作用域是函数级的。IIRC它允许您创建私有属性和方法。这都是关于变量作用域的。默认情况下,自执行函数中声明的变量仅对自执行函数中的代码可用。这允许编写代码,而不必关心其他JavaScript代码块中变量的命名方式 例如,如以下人员在评论中所述: (函数(){ var-foo=3

在javascript中,您希望何时使用此选项:

(function(){
    //Bunch of code...
})();
在这方面:

//Bunch of code...

名称空间。JavaScript的作用域是函数级的。

IIRC它允许您创建私有属性和方法。

这都是关于变量作用域的。默认情况下,自执行函数中声明的变量仅对自执行函数中的代码可用。这允许编写代码,而不必关心其他JavaScript代码块中变量的命名方式

例如,如以下人员在评论中所述:

(函数(){
var-foo=3;
console.log(foo);
})();

console.log(foo) > p>因为JavaScript中的函数是一个一流的对象,通过这样定义它,它有效地定义了一个“类”,非常像C++或C语言。
该函数可以定义局部变量,并在其中包含函数。内部函数(有效的实例方法)将有权访问局部变量(有效的实例变量),但它们将与脚本的其余部分隔离。

范围隔离,可能。这样函数声明中的变量就不会污染外部名称空间


当然,在一半的JS实现中,它们还是会的。

一个区别是,您在函数中声明的变量是本地变量,因此当您退出函数时,它们会消失,并且不会与其他或相同代码中的其他变量冲突。

是否有参数和“代码束”返回函数

var a = function(x) { return function() { document.write(x); } }(something);
结束。
something
的值由分配给
a
的函数使用<代码>某些东西
可能有一些不同的值(对于循环),并且每次都有一个新函数

自调用(也称为 自动调用)是当函数 一经批准立即执行 定义。这是一个核心模式和 为许多人打基础 JavaScript的其他模式 发展

我是它的超级粉丝:)因为:

  • 它将代码保持在最低限度
  • 它强化了行为与表现的分离
  • 它提供了防止命名冲突的闭包
极大地——(你为什么要说它好?)

  • 它是一次定义和执行一个函数
  • 您可以让该自执行函数返回一个值,并将该函数作为参数传递给另一个函数
  • 它有利于封装
  • 它也适用于块范围
  • 是的,您可以将所有的.js文件封装在一个自动执行函数中,并可以防止全局命名空间污染。;)

更多。

我不敢相信,没有一个答案提到隐含的全局

(function(){})(
构造不能防止隐式全局变量,这对我来说是一个更大的问题,请参见

基本上,函数块确保您定义的所有依赖“全局变量”都局限于您的程序,它不会保护您不去定义隐式全局变量。或者类似的方法可以提供如何防范这种行为的建议

更简洁的
var-App={}
语法提供了类似的保护级别,并且在“public”页面上时可以包装在函数块中。(有关使用此构造的库的实际示例,请参见或)


就私有属性而言,它们被高估了,除非你正在创建一个公共框架或库,但是如果你需要实现它们,有一些好的想法。

过于简单化了。看起来很正常,几乎让人感到安慰:

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 libarary's name() function can exist at the 
  // same time as ours. 

  var userName = "Sean";

  console.log(name());

  function name() {
    return 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;
    }
  }
)();
因此,在您阅读的大多数教程中,您现在会被术语“匿名自动执行”或类似的东西轰炸

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

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

极大地
(function main() {
  var userName = "Sean";

    console.log(name());

    function name() {
      return userName;
    }
  }
)();
for( var i = 0; i < 10; i++ ) {
  setTimeout(function(){
    console.log(i)
  })
}
for( var i = 0; i < 10; i++ ) {
  (function(num){
    setTimeout(function(){
      console.log(num)
    })
  })(i)
}
var myObject = {
    childObject: new function(){
        // bunch of code
    },
    objVar1: <value>,
    objVar2: <value>
}
object: {
    childObject: {
        childObject: {<value>, <value>, <value>}
    }, 
    objVar1: <value>,
    objVar2: <value>
}
(function(){
    var foo = {
        name: 'bob'
    };
    console.log(foo.name); // bob
})();
console.log(foo.name); // Reference error
var MyClosureObject = (function (){
  var MyName = 'Michael Jackson RIP';
  return {
    getMyName: function () { return MyName;},
    setMyName: function (name) { MyName = name}
  }
}());
 console.log(MyClosureObject.getMyName()); 
 // Michael Jackson RIP
console.log(MyClosureObject.MyName); 
// undefined
MyClosureObject.setMyName('George Michael RIP');
console.log(MyClosureObject.getMyName()); 
// George Michael RIP
var globalvar = "globalvar"; // this var can be accessed anywhere within the script

function scope() {
    alert(globalvar);
    var localvar = "localvar"; //can only be accessed within the function scope
}

scope(); 
void function() {
  console.log('boo!');
  // expected output: "boo!"
}();
let red_tree = new Node(10);

(async function () {
    for (let i = 0; i < 1000; i++) {
        await red_tree.insert(i);
    }
})();

console.log('----->red_tree.printInOrder():', red_tree.printInOrder());