你如何在JavaScript中解释这个结构?

时间:2008-10-09 05:35:49

标签: javascript design-patterns anonymous-function

(function() 
 {
     //codehere
 }
)();

这种语法有什么特别之处? 什么()();暗示?

7 个答案:

答案 0 :(得分:40)

创建一个匿名函数,closure和all,而final()告诉它自己执行。

它基本上与:

相同
function name (){...}
name();

所以基本上没有什么特别的代码,它只是创建方法并调用它而不必命名的'快捷方式'。

这也意味着该函数是一个off或一个对象的内部函数,并且在需要闭包的特性时最有用。

答案 1 :(得分:4)

这是一个被称为匿名函数。

这样做的目的是创建一个新的范围,局部变量不会从中消失。例如:

var test = 1;
(function() {
  var test = 2;
})();
test == 1 // true

关于这种语法的一个重要注意事项是,你应该养成用分号终止语句的习惯,如果你还没有。这是因为Javascript允许在调用函数名称及其括号之间进行换行。

以下代码段会导致错误:

var aVariable = 1
var myVariable = aVariable

(function() {/*...*/})()

这是它实际做的事情:

var aVariable = 1;
var myVariable = aVariable(function() {/*...*/})
myVariable();

创建新块作用域的另一种方法是使用以下语法:

new function() {/*...*/}

不同之处在于前一种技术不会影响关键字“this”所指向的位置,而第二种方法则不会。

Javascript 1.8也有一个let语句可以完成同样的事情,但不用说,大多数浏览器都不支持它。

答案 2 :(得分:2)

这是一个自动执行的匿名函数。最后的()实际上是在调用函数。

一本好书(我已阅读)解释了Javascript中这些类型语法的一些用法是Object Oriented Javascript

答案 3 :(得分:2)

这种用法基本上等同于C中的内部块。它可以防止块内 块中定义的变量在外部可见。因此,使用私有对象构建一个关闭类的方法很方便。如果您使用它来构建对象,请不要忘记return this;

var Myobject=(function(){
    var privatevalue=0;
    function privatefunction()
    {
    }
    this.publicvalue=1;
    this.publicfunction=function()
    {
        privatevalue=1; //no worries about the execution context
    }
return this;})(); //I tend to forget returning the instance
                  //if I don't write like this

答案 4 :(得分:1)

另见道格拉斯·克罗克福德(Douglas Crockford)出色的“JavaScript:The Good Parts”,来自O'Reilly,在这里:

http://oreilly.com/catalog/9780596517748/

...在YUIblog的视频中,这里:

http://yuiblog.com/blog/2007/06/08/video-crockford-goodstuff/

答案 5 :(得分:0)

第一组括号中的内容评估为函数。然后第二组括号执行此功能。因此,如果你有想要自动运行onload的东西,那么你可以如何加载和执行它。

答案 6 :(得分:0)