2013-06-22 47 views
2
(function(global, $data, undefined) { 
    $data.Entity.extend('TodoDBModel.TodoItem', { 
    'Id': { key:true,type:'Edm.Guid',nullable:false,required:true }, 
    'InSync': { type:'Edm.Boolean',nullable:false,required:true } 
    }); 
})(window, $data); 

这是一个简单的函数还是任何类型的类?这个JavaScript结构如何被调用?

我们如何定义这些参数global, $data, undefined以及以功能右括号和(window, $data)参数结尾的最后一行代码?

+0

这是一个有趣的问题,但是 - 我觉得更翔实的名字将真正帮助它“这是什么结构,称为”难求在谷歌或堆栈溢出搜索让它更适用于大众,我建议你改变名称 - 由你决定。 (也许是“什么是函数(立即称为自己调用”?或者甚至是更具代码性的东西,我不确定) –

+0

公平点@ benjamin-gruenbaum,标题的模糊性使我想要编辑它 - 但怎么做你从阅读中知道该函数立即自动调用? – icedwater

回答

6

它被称为IIFE - 立即调用函数表达式。

援引维基百科:

一种立即调用的函数表达式(或IIFE,发音为“还不确定”)是能产生使用JavaScript的函数作用域词法作用域一个JavaScript设计模式。可以使用立即调用的函数表达式来避免块内的变量提升,防止污染全局环境,同时允许公共访问方法,同时保留函数中定义的变量的隐私。这种模式被称为自我执行的匿名函数,但Ben Alman将该术语IIFE引入模式的语义更准确的术语中。

这里发生了什么是你正在定义一个函数(通过函数表达式)并立即调用它。这提供了封装。

例如,如果有人要覆盖语言原语值undefined *的值,它会将其作为第三个参数。它还提供两个参数(数据,这是在代码和window(在浏览器中的全局对象)作为global变量。

*严重的是,有没有人真正覆盖未定义的?还有,这是不可能的现代浏览器

这里是一个更基本的例子:

(function(i){ // declare a function that accepts a single parameter - i 
    alert(i);//alert the value of i 
    // Next, we'll invoke the function we just declared with the value 5, 
    // which means i will be 5 in the function 
})(5); 
+0

感谢你的解释我真的停留在它现在我已清除 – Blu