学习笔记2015-08-28
2015-08-28 23:35
197 查看
</pre><pre name="code" class="javascript">
<pre name="code" class="javascript"><span style="font-family: Arial, Helvetica, sans-serif;">function drag(){</span>var oTitle=getByClass('a','b')[0]; oTitle.onmousedown=fnDown;}function fnDown(){...}今天在看书的时候,pollyu给我发来这一段代码,问我为何在onmousedown的右边,fnDown函数没有括号。我突然一愣,一时间也想不出合适的理由,我的第一回答是这样的:onmousedown是一个函数对吧潘卷卷 16:21:00是茶花烟 16:21:29好 现在有 onmd = func();和onmd = func;茶花烟 16:21:52func();是这个函数执行完的结果。茶花烟 16:22:00func是这个函数的名称茶花烟 16:22:29前者是调用onmousedown的时候返回func函数的返回值茶花烟 16:23:07后者是调用onmousedown的时候等同于调用了func()后来想想还是颇有偏差,所以在这边整理一下:看以下的实例代码
function hi(){ var a = 1; return function(){ console.log(a++); }; }; var iris = hi(); var polly = hi; iris(); iris();
polly(); polly();在这里可以看见,将函数赋值给变量iris和polly,但是后者并没有带(),那么在这边iris和polly的区别在哪里?其实polly就是hi 函数本身,换句话说就是外层的function。polly()和hi()的结果是一样的。而iris是hi()调用之后返回的那个东西,也就是说它是里层的那个匿名函数function,变量a时它闭包里面的一个对象。iris()的调用结果是console.log(a++);可以这样写两个等式iris =hi() = polly() iris() =console.log(a++) = hi()() = polly()()回到Hi()函数,hi()是把hi函数运行之后返回 function(){console.log(a++)},这种返回叫做函数式编程。hi函数包含了一个闭包,也就是说hi函数返回的function(){console.log(a++)}这个函数会一直保持着对a引用。闭包请戳我iris的值是hi(),也就是function(){console.log(a++)},而iris再次运行的话就会打印出来a的值,每调用一次iris,那么打印的值a就会加上1.polly的值就是hi函数,就只是一个普通的a = 1 的赋值操作。所以上面的代码返回 1,2,1,1.在这边引用一下百度百科中的例子在Javascript中闭包(Closure)什么是闭包“官方”的解释是:所谓“闭包”,指的是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。相信很少有人能直接看懂这句话,因为他描述的太学术。我想用如何在Javascript中创建一个闭包来告诉你什么是闭包,因为跳过闭包的创建过程直接理解闭包的定义是非常困难的。看下面这段
代码
特点
这段代码有两个特点:1、函数b嵌套在函数a内部;2、函数a返回函数b。这样在执行完var c=a( )后,变量c实际上是指向了函数b,再执行c( )后就会弹出一个窗口显示i的值(第一次为1)。这段代码其实就创建了一个闭包,为什么?因为函数a外的变量c引用了函数a内的函数b,就是说:当函数a的内部函数b被函数a外的一个变量引用的时候,就创建了一个闭包。作用
简而言之,闭包的作用就是在a执行完并返回后,闭包使得Javascript的垃圾回收机制GC不会收回a所占用的资源,因为a的内部函数b的执行需要依赖a中的变量。这是对闭包作用的非常直白的描述,不专业也不严谨,但大概意思就是这样,理解闭包需要循序渐进的过程。在上面的例子中,由于闭包的存在使得函数a返回后,a中的i始终存在,这样每次执行c(),i都是自加1后alert出i的值。那 么我们来想象另一种情况,如果a返回的不是函数b,情况就完全不同了。因为a执行完后,b没有被返回给a的外界,只是被a所引用,而此时a也只会被b引 用,因此函数a和b互相引用但又不被外界打扰(被外界引用),函数a和b就会被GC回收。(关于Javascript的垃圾回收机制请读者自行搜索)今天的笔记大概就是这么多。最后补充一点,这个是在javascript中的情况,在html中onmousedown的标准写法依旧是onmousedown = “javascript()”;就到此为止。相关文章推荐
- 偷懒的一天(心得)
- 【一些事晚报】支付宝或无法再向他人银行账户转账
- IntentService简介
- mysqldump: Got error: 1045: Access denied for user 'roor'@'localhost' (using pas sword: YES) when tr
- 【ExtJs】使用Cookie、切换主题和语言
- PHP生成UUID
- vs2015使用GIt连接git.oschina.net/
- 与创业者一起共事是一种幸福的事
- 开源服务内部监控系统(二) ganglia简介
- UVA 12828 & CSU 1513 DFS
- 一键分享遇到网站认证失败
- C++编程常用头文件及其包含函数汇总
- Reflow & Repaint
- 常见的几种 CSS 水平垂直居中解决办法
- java实现一篇文件的重写
- 内存管理机制剖析
- 《技术管理之巅》-试读与吐槽
- HDU 2662 Coin && HDU 1792 A New Change Problem (互质数最大不能生成数)
- 一个小错误引发思考最终得出数组转字符串的新方法
- 过河卒