我如何阅读Javascript Closure语法?

dew*_*rde 5 javascript syntax closures

基于Doug Crockford讲座中的一些代码,我创造了这个.

var isAlphaUser = (function() {
    alert("Forming Alpha User List");
    let AlphaUsers = {
        1234: true,
        5678: true
    };

    return function(id){
        alert("Checking Alpha Users:",id); 
        return AlphaUsers[id];};
}());

alert("starting");
alert(isAlphaUser(1234));
alert(isAlphaUser(5678));
alert(isAlphaUser(3456));
Run Code Online (Sandbox Code Playgroud)

这给了我这个:

Forming Alpha User List
starting
Checking Alpha Users: 1234
true
Checking Alpha Users: 5678
true
Checking Alpha Users: 3456
undefined
Run Code Online (Sandbox Code Playgroud)

这是非常酷的,因为它只进行一次昂贵的设置,而且每次进一步的通话都是便宜的检查.

但是,我无法破译执行此操作的代码.具体来说,我无法理解为什么我需要在函数声明结束时使用"()".

有人可以解释这种语法是如何工作的吗?

Nic*_*ole 13

()调用一个函数. function() { }定义一个函数.()在立即调用1之后追加,并且分配结果(也是匿名函数)isAlphaUser.

function() { ... }()模式经常用于将变量隔离到内部范围,因此这些变量不会成为全局范围的一部分.

在这种情况下,这是发生的事情:

  1. 运行匿名函数,AlphaUsers在该范围内定义变量.
  2. 该函数返回另一个带1个参数的函数.此函数是AlphaUsers变量绑定的闭包(换句话说,可用).此函数检查传入的参数是否包含在内AlphaUsers(实际上,它返回该索引处的项,这只是一个布尔值).
  3. 返回值分配给变量isAlphaUser.
  4. 既然isAlphaUser现在是一个函数,可以调用它来查看参数是否包含在AlphaUsers变量中,但是AlphaUsers在全局范围内没有可用的直接访问(它变成了一种私有变量).

1 - 注意:正如评论中提到的cwolves一样,要注意虽然在这种情况下()直接附加}工作,但这只是因为在这种情况下函数定义是一个函数表达式.如果function是该行的第一个单词,该行变为函数声明,这就是该行可以执行的操作,该函数不是匿名的(它将需要名称,否则它是语法错误)并且不能立即内联调用.有关详细信息,请参阅函数声明与函数表达式.