在javascript中执行自动函数的目的是什么?

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

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

在此:

 //Bunch of code... 

其全部关于可变范围。 自执行函数中声明的variables默认只能用于自执行函数内的代码。 这允许编写代码而不用担心如何在JavaScript代码的其他块中命名variables。

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

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

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

等等…什么?

我的意思是。 如果有人input某种口音的字符(如法语或西class牙字符),但我只想要“英文”字符? Az在我的程序? 嗯……西class牙语的'n'和法国的'e /'字符(我已经用了两个字符作为这些字符,但是你可以把这个字符转换成代表这个字符的字符),这些字符可以被转换成'n'和'e'的基本字符。

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

一个问题:它有一个名为“我的function相同的function。

这就是所谓的碰撞。 我们有两个在同一个作用域中声明的同名的函数。 我们想要避免这一点。

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

在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…这是一个奇怪的看法,但完全合法。

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

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

 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”还没有被使用的机会是多less? …非常非常苗条

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

现在我们来到自动执行function(或自执行,自运行,不pipe)。

((){})();

这个语法像罪一样尴尬。 但是,它的工作。

当你用圆括号包装一个函数定义,并且包含一个参数列表(另一个集合或圆括号!)时,它就像一个函数调用一样

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

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

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

经过多年的专业发展,我强烈build议您将所编写的每个function都命名为debugging目的。

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

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

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

我是一个伟大的球迷:)的原因是:

  • 它将代码保持在最低限度
  • 它强化了行为与performance的分离
  • 它提供了一个防止命名冲突的closures

巨大 – (为什么你应该说它的好?)

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

更多在这里 。

命名空间。 JavaScript的范围是function级别的。

我不敢相信这些答案都没有提到隐含的全局variables。

(function(){})()结构不能防止隐含的全局variables,这对我来说是更大的担心,请参阅http://yuiblog.com/blog/2006/06/01/global-domination/

基本上,function块确保你定义的所有依赖的“全局variables”被限制在你的程序中,它不能保护你免于定义隐式全局variables。 JSHint或类似的可以提供有关如何防范这种行为的build议。

更简洁的var App = {}语法提供了类似的保护级别,并且可以在“public”页面上封装在function块中。 (请参阅Ember.js或SproutCore以了解使用此构造的库的真实世界示例)

private财产而言,除非你正在创build一个公共框架或图书馆,否则他们会被高估,但是如果你需要实施它们, 道格拉斯·克罗克福德 ( Douglas Crockford)会有一些好的想法。

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

当然,在那里JS的一半实现,他们将无论如何。

有一个参数,“Bunch of code”返回一个函数吗?

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

closures。 something的值被分配给a的函数asomething可能有一些不同的值(for循环),每次有一个新的function。

下面是自我调用匿名函数如何有用的一个很好的例子。

 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...

一个区别是你在函数中声明的variables是局部的,所以当你退出函数时它们会消失,并且不会和其他代码中的其他variables冲突。

由于Javascript中的函数是第一类对象,通过这种定义,它有效地定义了类似C ++或C#的“类”。

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

在javascript中自调用函数:

自调用expression式被自动调用(启动),而不被调用。 一个自调用expression式在创build后立即被调用。 这基本上用于避免命名冲突以及实现封装。 这个函数之外的variables或声明的对象是不可访问的。 为了避免最小化的问题(filename.min)总是使用自己执行的function。

(function(){ var foo = { name: 'bob' }; console.log(foo.name); // bob })(); console.log(foo.name); // Reference error

实际上,上面的函数将被视为没有名字的函数expression式。

用圆括号封闭函数的主要目的是为了避免污染全局空间。

函数expression式中的variables和函数变成了私有的,即它们将不在函数之外。

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

我知道当我喜欢使用自我执行的function。

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

该函数允许我使用一些额外的代码来定义更清晰的代码的childObjects属性和属性,例如设置常用variables或执行math公式; 哦! 或错误检查。 而不是仅限于嵌套的对象实例化语法…

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

一般来说,编码有很多模糊的方法来做很多相同的事情,让你想知道“为什么要麻烦?” 但新的情况不断涌现,你不能再依靠基本/核心的原则。

IIRC它允许你创build私有属性和方法。