博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
js:匿名函数/闭包前奏
阅读量:6528 次
发布时间:2019-06-24

本文共 1277 字,大约阅读时间需要 4 分钟。

js里面”万物皆对象“,函数同理

三种定义方式

a.传统的如同C语言一样的定义方式:function abc(){code}

b.少见的定义方式:var abc = new Function('参数','代码');  //由此可见我们的function是构造函数Function的对象实例,即函数也是对象 

c.匿名函数定义:var abc = function(){...} //写一个匿名函数,并让一个变量称为它的引用

 

对于匿名函数有很多奇技淫巧:

1.若是我们平时用a,b方法定义函数,实际调用的时候需在函数名后+()并写入参数,如abc(),abc(a)..这基础、浅显但是重要

2.直接用匿名函数不赋值,(function(...){....})(实参);

3.也就是你平常写个匿名函数function(){}它是不会执行的,它只相当于一个函数名

4.然后来了一堆乱七八糟的写法是和2等效的

~(function(){...})(); //返回-1

void function(){...}();  //返回undefined

+/- function(){...}(); //返回NaN

~function(){...}(); //返回-1

!function(){...}(); //返回true

(function(){...}()); //undefinded

你不知道哪些混蛋会突然这样写代码,尤其在闭包问题上,见识过总是好的

 

闭包前奏

有个例子被人举烂了

但是我们有大多碰到过这种情况,至少我碰到过

for(var i=1;i<=5;i++){

  setTimeout(function(){alert(i)},i*1000);

}

这样会输出5次"6"

然后很基本大家都知道

for(var i=1;i<=5;i++){

  setTimeout((function(){alert(i)})(i),i*1000);

}

就好了,

会依次输出各位数字

然后很多人说:“这就是闭包”

wtf?这真的是闭包?

按照上一篇关于reference value 和 primitive value的解释

和之前我们对匿名函数的认识

就足够解释这一现象了,不需要闭包知识

 

由于alert是延迟执行的,按照第一种写法,哪怕只有1000ms,i已经变成6了

按照第二种写法会得到我们预期的效果是因为

在这个匿名函数后面加了(),

相当于在往setTimeout里放fallback函数时,

就执行了一次匿名函数

i是primitive value

函数传参的形式把当时的i值复制了份传了进去

这和闭包并没有太大的关系

 

抛开学术用语,我个人目前浅表的理解是这样

“如果一个func 里面的 innerFunc 被作为返回值”

则称之为闭包

这样func里面的环境及变量会被一直保留在内存之中

关于闭包,作为前奏先叙述到这里

将会在正篇继续研究和讨论

 

转载于:https://www.cnblogs.com/AlexNull/p/4778216.html

你可能感兴趣的文章
am335x 电容屏驱动添加。
查看>>
JavaScript Unicode字符操作
查看>>
rhel-server-7.2-x86_64无法联网(VMware环境)
查看>>
Nginx配置中的log_format用法梳理(设置详细的日志格式)
查看>>
Atitit 软件工程概览attilax总结
查看>>
优化LibreOffice如此简单
查看>>
【Oracle 数据迁移】环境oracle 11gR2,exp无法导出空表的表结构【转载】
查看>>
秒杀系统设计方案
查看>>
3D印花芭蕾舞鞋为舞者科学地保护双脚
查看>>
冲浪科技获Ventech China数百万美元天使轮融资,发力自动驾驶行业
查看>>
通过ActionTrail监控AccessKey的使用
查看>>
从 JavaScript 到 TypeScript
查看>>
一个mysql复制中断的案例
查看>>
【最佳实践】OSS开源工具ossutil-大文件断点续传
查看>>
Linux常用的服务器构建
查看>>
深入了解 Weex
查看>>
Android第三方开源FloatingActionButton(com.getbase.floatingactionbutton)【1】
查看>>
【75位联合作者Nature重磅】AI药神:机器学习模型有望提前五年预测白血病!
查看>>
精通SpringBoot——第二篇:视图解析器,静态资源和区域配置
查看>>
JavaScript基础(六)面向对象
查看>>