这个JavaScript结构是如何调用的?

这个JavaScript结构是如何调用的?,javascript,Javascript,这是一个简单的函数还是任何类型的类 我们如何定义这些参数global,$data,undefined,,以及以函数右括号结尾的最后一行代码和(window,$data)参数?它被称为一个立即调用的函数表达式 引用维基百科: 立即调用的函数表达式(或IIFE,发音为“iffy”)是一种JavaScript设计模式,它使用JavaScript的函数作用域生成词法作用域。立即调用的函数表达式可用于避免从块内提升变量,防止污染全局环境,同时允许公众访问方法,同时保留函数内定义的变量的隐私。这个模式被称为

这是一个简单的函数还是任何类型的类

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

它被称为一个立即调用的函数表达式

引用维基百科:

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

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

例如,如果有人要覆盖语言原语值类型的值
undefined
*它将作为第三个参数。它还提供对两个参数(数据,它是代码中的一个变量)和
窗口中的
(浏览器中的全局对象)的访问,即
global

*说真的,有人真的覆盖过未定义的内容吗?而且,这在现代浏览器中是不可能的

以下是一个更基本的示例:

(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);

然而,这是一个有趣的问题——我认为一个信息量更大的名称确实会有所帮助。“这个结构叫什么”在google或stack overflow搜索中很难找到。为了使它更适用于一般公众,我建议你更改名称——由你决定。(可能是“什么是函数(立即调用自己的函数)”?甚至是一些更复杂的东西。我不确定)公平点@benjamin gruenbaum,标题的模糊性吸引我编辑它-但是你怎么从阅读中知道函数会立即调用自己?谢谢你的解释,我现在真的坚持下去了,我被清除了
(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);