也谈自执行函数
立即执行函数的定义
下面来看一个立即执行函数的例子:
var immediate_one = function() { return 1; }(); console.log(immediate_one) ; //1
这里可以看到,通过一个一次性函数,它自动运行并且返回一个值,然后赋值给immediate_one
如果,把代码改成如下:
var immediate_one = function() { return 1; }
那么immediate应该是一个函数,而不是一个函数的返回值了,并且他不会执行,这只不过是一个函数表达式的定义而已了。
但是如下的写法确实错误的:
function myfunc() { return 1; }();
我们在Firefox控制台打印会报如下的错误:
这是因为myfunc是使用函数声明语法定义的,而不是函数表达式语法。二者之间的区别有时候不是很显著,除非你考虑到代码在程序中位于何处。可以将该函数作为有一个操作数传递给分组操作符圆括号,从而可以修正这个语法错误:
(function myfunc() { return 1; })();
我们需要做的只是把函数包含到圆括号里面,这有何区别呢?在这个例子中,函数不再是位于主程序代码中,而是作为一个操作数传递给一个分组操作符(),他直接返回该函数。这将函数声明转换成了函数表达式,并且后面()执行了该函数。函数声明是不能作为操作数的,因此,解析器消除了该语法的歧异,并且将这个函数当做一个函数表达式对待。向下面这样放置分组运算符圆括号也是有效的:
(function myfunc() { return 1; }())
立即执行函数的作用
a.用来初始化
立即执行函数的一种用法是,进行一次性初始化。通常,你想要进行一些初始化,而又不会遗留下全局变量。如果这一初始化过程足够复杂,以至于需要临时变量,可以将所有的代码放到立即执行函数里面,让该函数为你执行清理工作。
如下代码是将单击事件处理程序分配给按钮,这是一种很好的选择:
(function() { for(var i = 1; i <= 3; i++) { document.getElementById("button-" + i).onclick = function() { //事件处理的逻辑代码写在这里 } } }());
如果不用立即执行函数,变量i将保留在全局作用域里面,会污染作用域。
b.实现私有性
立即执行函数也可以实现私有性。你可以让全局函数定义在其他函数的闭包中,并且共享这个闭包的本地作用域。
如下是一个简单的迭代器的实现:
var next, previous, rewind; (function(){ var index = -1, data = ["eeny", "meeny", "miny", "moe"], count = data.length; next = function() { if(index < count) { index++; } return data[index]; } previous = function() { if(index >= 0) { index--; } return data[index]; } rewind = function() { index = -1; } }()); console.log(next()); //eeny console.log(previous()); //undefined console.log(next()); //eeny console.log(next()); //meeny
这个例子中,inde,data,count是私有的, 因为这个迭代器的用户只需要向前走或者向后走的方法,并且可能不会访问数据和指针,他们不会决心把数据和指针搞乱。
分类:
javascript
标签:
javascript
posted on 2016-01-18 11:06 ChessZhang 阅读(802) 评论(2) 编辑 收藏 举报
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?