用javascript实现自我执行功能的目的是什么?

在javascript中,您什么时候要使用它:

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

在此:

//Bunch of code...
理查德Tony2020/03/16 22:23:33

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

逆天宝儿米亚2020/03/16 22:23:33

看来这个问题已经准备好了,但我还是会发表我的意见。

我知道何时需要使用自执行功能。

var myObject = {
    childObject: new function(){
        // bunch of code
    },
    objVar1: <value>,
    objVar2: <value>
}

该功能使我可以使用一些额外的代码来定义更干净代码的childObjects属性和属性,例如设置常用变量或执行数学方程式;哦! 或错误检查。而不是限于...的嵌套对象实例化语法

object: {
    childObject: {
        childObject: {<value>, <value>, <value>}
    }, 
    objVar1: <value>,
    objVar2: <value>
}

一般来说,编码有很多晦涩的方式来做很多相同的事情,这使您想知道“为什么要打扰?” 但是,新的情况不断出现,您将无法再仅依靠基本/核心原则。

猪猪阿飞2020/03/16 22:23:33

首先,您必须访问MDN IIFE,现在有关此点

  • 这是立即调用函数表达式因此,当您的JavaScript文件从HTML调用时,此函数会立即调用。
  • 这样可以防止在IIFE惯用语中访问变量以及污染全局范围。
达蒙逆天Pro2020/03/16 22:23:33

自执行功能用于管理变量的范围。

变量的范围是程序在其中定义的区域。

全局变量具有全局范围;它在JavaScript代码中的任何地方定义,并且可以从脚本中的任何位置(甚至在函数中)进行访问。另一方面,在函数内声明的变量仅在函数体内定义。它们是局部变量,具有局部范围,只能在该函数中访问。函数参数也算作局部变量,并且仅在函数体内定义。

如下所示,您可以访问函数内部的globalvariable变量,还请注意,在函数主体内,局部变量优先于具有相同名称的全局变量。

var globalvar = "globalvar"; // this var can be accessed anywhere within the script

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

scope(); 

因此,基本上,一个自执行函数允许编写代码而无需担心在其他JavaScript代码块中如何命名变量。

神无西里2020/03/16 22:23:33

javascript中的自调用函数:

自调用表达式将自动调用(启动),而不被调用。自调用表达式创建后立即被调用。基本上,这用于避免命名冲突以及实现封装。在此函数之外无法访问变量或声明的对象。为了避免最小化问题(filename.min),请始终使用自执行函数。

Tony宝儿梅2020/03/16 22:23:33

由于Javascript中的函数是一类对象,因此通过这样定义它,可以有效地定义一个类似于C ++或C#的“类”。

该函数可以定义局部变量,并在其中包含函数。内部函数(有效的实例方法)将可以访问局部变量(有效的实例变量),但它们将与脚本的其余部分隔离。

用户70493023002020/03/16 22:23:33

一个区别是,您在函数中声明的变量是局部变量,因此在退出函数时它们会消失,并且不会与其他代码中的其他变量发生冲突。

猴子乐2020/03/16 22:23:33

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

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

小哥猪猪2020/03/16 22:23:32

这是一个自我调用匿名函数如何有用的可靠示例。

for( var i = 0; i < 10; i++ ) {
  setTimeout(function(){
    console.log(i)
  })
}

输出: 10, 10, 10, 10, 10...

for( var i = 0; i < 10; i++ ) {
  (function(num){
    setTimeout(function(){
      console.log(num)
    })
  })(i)
}

输出: 0, 1, 2, 3, 4...

樱前端2020/03/16 22:23:32

是否有一个参数,“代码段”返回一个函数?

var a = function(x) { return function() { document.write(x); } }(something);

关闭。的值something由分配给的函数使用asomething可能具有一些变化的值(for循环),并且每次都有一个新函数。

StafanStafan2020/03/16 22:23:32

Self-invocation (also known as auto-invocation) is when a function executes immediately upon its definition. This is a core pattern and serves as the foundation for many other patterns of JavaScript development.

I am a great fan :) of it because:

  • It keeps code to a minimum
  • It enforces separation of behavior from presentation
  • It provides a closure which prevents naming conflicts

Enormously – (Why you should say its good?)

  • It’s about defining and executing a function all at once.
  • You could have that self-executing function return a value and pass the function as a param to another function.
  • It’s good for encapsulation.
  • It’s also good for block scoping.
  • Yeah, you can enclose all your .js files in a self-executing function and can prevent global namespace pollution. ;)

More here.

Itachi阳光2020/03/16 22:23:32

命名空间。JavaScript的作用域是功能级别的。

小小卡卡西2020/03/16 22:23:32

我不敢相信所有答案都没有暗示全球。

(function(){})()构造无法防止隐含的全局变量,对我而言,这是一个更大的问题,请参见http://yuiblog.com/blog/2006/06/01/global-domination/

基本上,功能块确保您定义的所有相关“全局变量”都局限于程序中,它不能保护您免受隐式全局变量的影响。JSHint等可以提供有关如何防御此行为的建议。

更简洁的var App = {}语法提供了类似的保护级别,并且在“公共”页面上时可以包装在功能块中。有关使用此构造的库的真实示例,请参见Ember.jsSproutCore

private属性而言,除非您要创建公共框架或库,否则它们会被高估,但是如果您需要实现它们,Douglas Crockford有一些好主意。

ASamGreen2020/03/16 22:23:32

其全部与可变作用域有关。默认情况下,自执行函数中声明的变量仅可用于自执行函数中的代码。这样就可以编写代码,而不必担心在其他JavaScript代码块中如何命名变量。

例如,如亚历山大的评论中所述

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

alert(foo); 

这将首先警报“ 3”,然后在下一个警报上引发错误,因为未定义foo。