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() { ... }()模式经常用于将变量隔离到内部范围,因此这些变量不会成为全局范围的一部分.
在这种情况下,这是发生的事情:
AlphaUsers在该范围内定义变量.AlphaUsers变量绑定的闭包(换句话说,可用).此函数检查传入的参数是否包含在内AlphaUsers(实际上,它返回该索引处的项,这只是一个布尔值).isAlphaUser.isAlphaUser现在是一个函数,可以调用它来查看参数是否包含在AlphaUsers变量中,但是AlphaUsers在全局范围内没有可用的直接访问(它变成了一种私有变量).1 - 注意:正如评论中提到的cwolves一样,要注意虽然在这种情况下()直接附加}工作,但这只是因为在这种情况下函数定义是一个函数表达式.如果function是该行的第一个单词,该行变为函数声明,这就是该行可以执行的操作,该函数不是匿名的(它将需要名称,否则它是语法错误)并且不能立即内联调用.有关详细信息,请参阅函数声明与函数表达式.
| 归档时间: |
|
| 查看次数: |
801 次 |
| 最近记录: |